比较双重时的不同行为

whd*_*whd 6 c java

您好我知道计算机受数字精度的限制,有些数字无法在二进制系统中准确表示.这就是我问为什么这样比较的原因

(0.1*3) == 0.3
Run Code Online (Sandbox Code Playgroud)

在Java语言中评估为false在C中它评估为true,对我来说Java行为更直观一些.任何提供的答案都不能回答我的问题,为什么他们有不同的行为,因为两者都使用IEEE 754标准.

@update我正在使用ideone来测试条件.

Dav*_*ble 2

众所周知,比较浮点值是不精确的。

对于任何给定的浮点运算,只能保证精度低至DBL_EPSILON/ Double.Epsilon。超出此精度的任何位都是算术运算的产物,应被忽略。

不同的程序,当然还有不同的语言,将以不同的方式实现这种比较(显然)。如果您能够设法将值与特定精度进行比较,即值的表示范围内的特定位数(例如,IEEE 双精度浮点数为 52 位或更少),则您更有可能获得相同的结果。

参考 (2016 年 4 月添加)

以下是经常被引用的浮点数及其行为方式的解释:
每个计算机科学家应该了解浮点算术