双重计算产生奇数结果

时间:2011-11-24 08:01:50

标签: java floating-point double

我有2个数字存储为Double,1.4300和1.4350。当我减去1.4350 - 1.4300时,它给出了结果:0.0050000000000001155。为什么它会在最后添加1155,如何解决这个问题,使其返回0.005或0.0050?我不确定舍入是否有效,因为我使用的是2位和4位十进制数。

3 个答案:

答案 0 :(得分:13)

哦,我喜欢这些...这些是由双重表示中的不准确引起的,而浮点运算充满了这些。它通常由二进制中的重复数字(即base-2浮点表示)引起。例如,在十进制1/3 = 0.3333'中,二进制1/10是一个重复数字,这意味着它不能完美表示。试试这个:1 - 0.1 - 0.1 - 0.1 - 0.1。你不会得到0.6: - )

要解决这个问题,请使用BigDecimal(首选)或操作double,先将其乘以10000,然后将其四舍五入再重新划分(不太干净)。

好问题......它在过去造成了巨大的问题。导弹过冲目标,卫星在发射后坠毁等。在网上搜索一些,你会感到惊讶!

答案 1 :(得分:4)

这是一些常见的陷阱,其中包含部分数字的计算机表示,请参阅this question或google查看floating point precision

答案 2 :(得分:2)

对于非常精确的浮点计算,Double不是正确的类型,如果你想要精确的结果,你必须使用BigDecimal。