为什么这个减法不等于零?

Bri*_*Pan 7 java math floating-point coldfusion

我在ColdFusion代码中发现了这些值,但Google计算器似乎有相同的"错误",其中差异不为零.

416582.2850 - 411476.8100 - 5105.475 = -2.36468622461E-011

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

JavaCast将这些设置为long/float/double没有帮助 - 它会导致其他非零差异.

Gre*_*ill 17

这是因为在基数10中"看起来"的十进制数字在基数2中不能完全表示(这是计算机用来表示浮点数的数字).有关此问题和解决方法的详细说明,请参阅文章科学家应该知道的关于浮点运算的文章.


Mic*_*ers 7

浮点不准确(有无数个实数,只有有限数量的32位或64位数字来表示它们).

如果你无法处理微小的错误,你应该使用BigDecimal.

  • 它不是必须有限的基础10表示,它是基础2表示.请参阅http://en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary,了解哪些分数可以用二进制精确表示(只有那些分数为2作为分母的主要因子). (2认同)

Hen*_*nry 6

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

zero = PrecisionEvaluate(416582.2850 - 411476.8100 - 5105.475);
Run Code Online (Sandbox Code Playgroud)

不像Evaulate(),不需要"".