据我所知,著名的
(0.1 + 0.2) !== 0.3抓到你其实不是Javascript的错。这正是IEEE 754的工作方式。Python中也有类似的输出,它也遵循IEEE 754规则。
那么,为什么这个特定的例子可以像C中所期望的那样工作呢?如果我直接比较
printf("%d\n", (0.1+0.2) == 0.3);我得到(un?)预期的输出0,但如果将值放入变量或打印出来,则得到正确的四舍五入的答案。
C可运行的示例
IEEE 754的C实现是在做额外的事情吗?或者是我完全错过了什么东西。
更新
我发布的代码示例由于错误而被破坏了。试试这个修正C可运行示例
但最初的问题仍然存在。
double d1, d2, d3;
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
printf ("%.17f\n", d1+d2);
printf ("%d\n", ((d1+d2) == d3));输出是
1
0.30000000000000004
1现在重新措辞的问题是:
发布于 2012-07-03 10:04:37
为什么(以及何时,以及如何)C编译器冒昧地说 0.3 == 0.30000000000000004 考虑到所有的事实,不是C实现被破坏了吗,而不是Javascripts的呢?
事实并非如此。
给出的输出来自以下代码:
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));但你写道:
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;所以d3不是0.3,而是0.30000000000000004
发布于 2012-07-03 09:58:21
`printf("%d\n", (0.1+0.2) == 0.3);`这是双倍,而不是浮标。
做:
printf("%d\n", (0.1+0.2) == 0.3);
printf("%d\n", (0.1f+0.2f) == 0.3f);然后瞧!
http://codepad.org/VF9svjxY
Output:
0
1看看这个问题。另外,使用GCC的ppl得到的结果与MSVC的ppl不同。打印浮点数的整体部分
发布于 2012-07-03 09:53:30
示例代码使用1、2和(1+2),它们都完全可以用双精度浮点表示。另一方面,在浮点中不完全可以表示,因此得到了这个数字的近似。当添加大约0.1到大约0.2时,您将得到大约0.3,但是这是否将是编译器在表示0.3时所选择的完全相同的近似。
表示使用二进制。这意味着它使用了1/2、1/4、1/8、1/16、1/32 (等等)。这意味着0.5,0.25等完全可以被表示。不是二元分数的精确和的数字可以非常接近地近似。
解决方案:不要互相比较浮点数。把他们的差异与一些你不关心的小数字进行比较。
#define EPSILON 0.000001
printf("%d", fabs((0.1+0.2) - 0.3 ) < EPSILON );我不知道为什么C代码工作,python/javascript不工作,这很神奇。但希望这能回答你的问题。
https://stackoverflow.com/questions/11308272
复制相似问题