比较双重时的不同行为

时间:2016-04-05 13:43:04

标签: java c

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

(0.1*3) == 0.3
Java语言中的

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

@Update 我正在使用ideone来测试条件。

1 个答案:

答案 0 :(得分:2)

比较浮点值是出了名的不精确。

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

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

参考 (2016年4月添加)

以下是经常引用的浮点数及其行为方式的解释:
What Every Computer Scientist Should Know About Floating-Point Arithmetic