0
#include <stdio.h>
int main()
{
    float f; 
    f = 0.4;
    if(f<0.4)
       printf("It is less");
    if(f>0.4)
       printf("It is greater");
    if(f==0.4)
       printf("It is equal");
}

我无法理解为什么输出显示“它更大”。

我得到0.4转换为二进制表示是0x3ECCCCCD,即4.000000059604644775390625E-1。疑问是如果 f 存储这个四舍五入的值,为什么比较中的 0.4 是准确的。如果 f 和 0.4 都四舍五入,则输出应该是“它相等”。

我尝试使用 f = 0.5,它显示“它是相等的”。

当 f=0.9 时,它显示“它更少”。

请注意,根本没有算术。

4

1 回答 1

4

虽然f是 a float,但你所有的文字都是double

如果你问得好,编译器甚至会警告你赋值

警告:从“double”到“float”的转换将值从“4.0000000000000002e-1”更改为“4.00000006e-1f”[-Wfloat-conversion]

不幸的是,它不能警告比较,因为简单地扩大较小的类型几乎总是你想要的,因此被编纂了。

无论如何,浮点数学对于外行来说是危险且令人惊讶的:
浮点数学被破坏了吗?

于 2018-11-27T19:01:59.057 回答