【问题标题】:Double calculation producing odd result [duplicate]双重计算产生奇数结果[重复]
【发布时间】:2012-01-05 10:18:52
【问题描述】:

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

【问题讨论】:

    标签: java floating-point double


    【解决方案1】:

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

    要解决这个问题,请使用 BigDecimal(首选)或通过先将其乘以 10000 之类的值来操作双精度数,然后对其进行舍入,然后再将其除以(不太干净)。

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

    【讨论】:

    【解决方案2】:

    这是小数的一些计算机表示的常见缺陷,请参阅this question 或谷歌floating point precision

    【讨论】:

    • +1:所以,如此普遍,令人惊讶的是人们并不知道它。
    【解决方案3】:

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

    【讨论】:

    • 在这种情况下不需要使用 BigDecimal(这有很多问题)。对输出进行适当舍入就足够了。
    • @sleske:BigDecimal 有什么问题?我只知道性能。
    • @Max:主要是性能(CPU 开销、内存使用和 GC 的额外工作),以及 非常 笨重的 API(无法使用运算符)。跨度>
    • @Max:BigDecimal 有有效的用途。我只是想指出,在这样一个简单的情况下,它并不是真正必要的,因此应该避免恕我直言。
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2012-03-05
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多