Java 产生奇数结果的双重计算

Java 产生奇数结果的双重计算,java,floating-point,double,Java,Floating Point,Double,我有两个存储为双精度的数字,1.4300和1.4350。当我减去1.4350-1.4300时,结果是:0.0050000000000001155。为什么它在末尾加1155,我如何解决这个问题,使它返回0.005或0.0050?我不确定舍入是否有效,因为我正在处理2和4个十进制数。对于非常精确的浮点计算来说,Double不是合适的类型,如果你想要精确的结果,你必须使用BigDecimal。这是一些计算机表示小数的常见陷阱,请参阅或谷歌获取。哦,我喜欢这些。。。这些都是由双精度表示中的不精确性造成的

我有两个存储为双精度的数字,1.4300和1.4350。当我减去1.4350-1.4300时,结果是:0.0050000000000001155。为什么它在末尾加1155,我如何解决这个问题,使它返回0.005或0.0050?我不确定舍入是否有效,因为我正在处理2和4个十进制数。

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

这是一些计算机表示小数的常见陷阱,请参阅或谷歌获取。

哦,我喜欢这些。。。这些都是由双精度表示中的不精确性造成的,浮点算法中充满了这些不精确性。它通常是由二进制中的循环数字引起的,即基数为2的浮点表示。例如,在十进制1/3=0.3333中,二进制1/10中的“1”是一个循环数,这意味着它不能完美地表示。试试这个:1-0.1-0.1-0.1-0.1-0.1。你不会得到0.6:-

要解决这个问题,请使用BigDecimal preferred或通过先将其乘以10000,然后将其四舍五入,然后再将其除以不太干净的值来处理double


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

这种情况下不需要使用BigDecimal,因为它有很多问题。对输出进行适当的四舍五入就足够了。@sleske:那么BigDecimal有什么问题呢?我只知道性能。@Max:主要是性能CPU开销、内存使用和GC的额外工作,而非常笨重的API无法使用运算符。@Max:BigDecimal有一些有效的用法。我只是想指出,在这样一个简单的情况下,这并不是真的必要,因此应该避免。伊姆霍+1:所以,这很常见,令人惊讶的是,人们并不知道。你是认真对待导弹和卫星的吗?还是讽刺?除了我能找到的两个。。。