【发布时间】: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
我有 2 个数字存储为 Double,1.4300 和 1.4350。当我减去 1.4350 - 1.4300 时,结果是:0.0050000000000001155。为什么它会在末尾添加 1155,我该如何解决这个问题,使其返回 0.005 或 0.0050?我不确定四舍五入是否有效,因为我使用的是 2 位和 4 位十进制数字。
【问题讨论】:
标签: java floating-point double
哦,我喜欢这些……这些是由于双精度表示的不准确造成的,而浮点运算中充满了这些。它通常是由二进制中的重复数字(即 base-2 浮点表示)引起的。例如,十进制 1/3 = 0.3333' 二进制 1/10 是一个循环数,这意味着它不能完美地表示。试试这个:1 - 0.1 - 0.1 - 0.1 - 0.1。你不会得到 0.6 :-)
要解决这个问题,请使用 BigDecimal(首选)或通过先将其乘以 10000 之类的值来操作双精度数,然后对其进行舍入,然后再将其除以(不太干净)。
好问题...它在过去造成了巨大的问题。导弹越过目标,卫星发射后坠毁等。在网上搜索一些,你会感到惊讶!
【讨论】:
这是小数的一些计算机表示的常见缺陷,请参阅this question 或谷歌floating point precision。
【讨论】:
对于非常精确的浮点计算,Double 不是正确的类型,如果您想要精确的结果,您必须使用 BigDecimal。
【讨论】: