c - 解释这种浮点行为

标签 c floating-point

请解释为什么以下代码的行为不同。

#include<stdio.h>
int main(){
 float a=0.1;
 if(a<0.1)
  printf("less");
 else 
  printf("greater than equal");
getchar();
}

输出:大于等于

 #include<stdio.h>
 int main(){
 float a=0.7;
 if(a<0.7)
  printf("less");
 else 
  printf("greater than equal");
getchar();
}

Output:less 与我的预期相反。

PS:这不是作业。

最佳答案

这里涉及到两种不同的类型:floatdouble。您正在分配给一个float,然后比较一个double

假设 floatdouble 实际上是 2 位和 4 位 decimal 浮点类型。现在假设您有:

float a = 0.567123 // Actually assigns 0.57
if (a < 0.567123) // Actually compares 0.5700 with 0.5671
{
    // We won't get in here
}

float a = 0.123412; // Actually assigns 0.12
if (a < 0.123412) // Actually compares 0.1200 with 0.1234
{
    // We will get in here
}

显然这是对正在发生的事情的近似,但它解释了两种不同的结果。

如果没有更多信息,很难说您应该做什么 - 很可能您不应该使用 floatdouble 在所有情况下,或者您应该使用某种程度的公差进行比较,或者您应该在任何地方使用 double,或者您应该接受某种程度的“不准确”作为系统工作方式的一部分.

关于c - 解释这种浮点行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9461744/

相关文章:

c++ - 与 Unresolved 符号的另一个链接问题

c - `pthread_mutex_lock` 和 `pthread_cond_wait` 是否在同一个队列中等待?

c# - 使用逗号和点将 float 转换为字符串

JavaScript - 在什么操作之后需要 toFixed() 以及应该传递什么参数?

javascript - 在 Javascript 中验证浮点精度

c - 你如何在 Ubuntu 上编译 OpenGL 程序?

asp.net - 如何在VS2012下构建SplendidCRM 2.1?

c++ - 为什么将 double 类型转换为 int 似乎会在第 16 位数字后四舍五入?

c - 执行返回-Ubuntu

java - 在双变量中获取数字的问题