据我了解,著名的
(0.1 + 0.2) !== 0.3
gotcha 实际上不是 Javascript 的错。这正是 IEEE 754 的工作方式。类似的输出发生在 Python 中,它也遵循 IEEE 754 规则。
那么这个特定示例如何在 C 中按预期工作,有时. 如果我做一个直接比较
printf("%d\n", (0.1+0.2) == 0.3);
我得到了(未?)预期的输出0
,但是如果我将这些值放入变量中或将它们打印出来,我会得到正确四舍五入的答案。
IEEE 754 的 C 实现是否做了额外的事情?还是我完全错过了其他东西。
更新
我发布的代码示例由于拼写错误而损坏。试试这个 Fixed C Runnable Example
但原来的问题仍然存在。
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
现在改写的问题是:
为什么(以及何时以及如何)C 编译器冒昧地说
0.3 == 0.30000000000000004
鉴于所有事实,C 实现不是真的坏了,而不是 Javascripts'?