我正在编写将处理货币,费用等的代码.我将使用BigDecimal类用于数学和存储,但是我们遇到了一些奇怪的事情.
这个说法:
1876.8 == BigDecimal('1876.8')
返回false.
如果我通过格式化字符串“%.13f”运行这些值,我得到:
"%.20f" % 1876.8 => 1876.8000000000000 "%.20f" % BigDecimal('1876.8') => 1876.8000000000002
注意从最后一个小数位的BigDecimal的额外的2.
我认为BigDecimal应该是将计算机的本机浮点直接存入实际数字的不正确性.这2来自哪里?
解决方法
你是对的,BigDecimal应该正确存储,我最好的猜测是:
> BigDecimal正确存储该值
>当传递给字符串格式化函数时,BigDecimal被转换为较低精度的浮点值,创建… 02.
>当直接与浮点数进行比较时,浮点数有一个额外的小数位,远远超过了你所看到的20(经典的浮点数不能比较behavoir).
无论哪种方式,您都不太可能获得比较浮点数与BigDecimal的准确结果.