繁体   English   中英

为什么此减法不等于零?

[英]Why does this subtraction not equal zero?

我在我的ColdFusion代码中碰巧遇到了这些值,但Google计算器似乎有相同的“错误”,其差为非零。

416582.2850-411476.8100-5105.475 = -2.36468622461E-011

http://www.google.com/search?hl=zh_CN&rlz=1C1GGLS_enUS340US340&q=416582.2850+-+411476.8100+-+5105.475&aq=f&oq=&aqi=

JavaCast将它们转换为long / float / double并没有帮助-导致其他非零差异。

这是因为在基数10中“四舍五入”的十进制数字不能在基数2中精确表示(这是计算机用来表示浮点数的方式)。 有关此问题和解决方法的详细说明,请参阅文章“每个计算机科学家都应了解的浮点运算法则”。

浮点数错误(实数无限,只有有限数量的32或64位数字可以表示它们)。

如果您无法处理微小的错误,则应改用BigDecimal

在ColdFusion中使用PrecisionEvaluate() (它将在Java中使用BigDecimal

zero = PrecisionEvaluate(416582.2850 - 411476.8100 - 5105.475);

Evaulate()不同,不需要“”。

由于计算机以二进制形式存储数字,因此浮点数不精确。 1E-11的差别很小,原因是将这些十进制数四舍五入为最接近的可表示二进制数。

此“错误”不是错误。 这就是浮点算法的工作原理。 请参阅: http : //docs.sun.com/source/806-3568/ncg_goldberg.html

如果要在Java中实现任意精度,请使用BigDecimal

    BigDecimal a = new BigDecimal("416582.2850");
    BigDecimal b = new BigDecimal("411476.8100");
    BigDecimal c = new BigDecimal("5105.475");
    System.out.println(a.subtract(b).subtract(c)); // 0.0

问题是浮点类型的不精确表示。 由于这些不能精确地表示为浮点数,因此会导致一些精度损失,从而导致操作误差很小。 通常,对于浮点数,您想比较结果是否等于某个小附加值(误差因子)内的另一个值。

这些是浮点问题,使用BigDecimal可以解决此问题。

更改减法的顺序在Google中也会产生零。

416582.2850 - 5105.475 - 411476.8100 = 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM