我注意到Java float精度的一些问题
Float.parseFloat("0.0065") - 0.001 // 0.0055000000134110451
new Float("0.027") - 0.001 // 0.02600000000700354575
Float.valueOf("0.074") - 0.001 // 0.07399999999999999999
我不仅对Float
有意见,对Double
也有意见。
有人能解释一下幕后发生了什么吗,我们如何才能得到一个准确的数字?在处理这些问题时,正确的方法是什么?
发布于 2012-10-06 02:33:40
问题很简单,float
的精度是有限的;它不能准确地表示0.0065
。(当然,double
也是如此:它具有更高的精度,但仍然是有限的。)
另一个问题使上述问题更加明显,那就是0.001
是一个double
而不是float
,所以您的float
被提升为double
来执行减法,当然,在这一点上,系统无法恢复double
本来可以表示的丢失的精度。要解决这个问题,您可以这样写:
float f = Float.parseFloat("0.0065") - 0.001f;
使用0.001f
而不是0.001
。
发布于 2012-10-06 02:32:39
参见What Every Computer Scientist Should Know About Floating-Point Arithmetic。你的结果在我看来是正确的。
如果您不喜欢浮点数的工作方式,可以尝试使用BigDecimal之类的方法。
发布于 2012-10-06 02:32:32
你得到了正确的结果。确切地说,没有0.027这样的float
,也没有这样的double
。如果你使用float
或double
,你总是会得到这些错误。
float
和double
存储为二进制小数:类似于1/2 + 1/4 + 1/16...您不能将所有的十进制值精确地存储为有限精度的二进制小数。这在数学上是不可能的。
唯一的替代方法是使用BigDecimal
,您可以使用它来获得精确的十进制值。
https://stackoverflow.com/questions/12752038
复制相似问题