在Java中使用parseFloat的正确方法是什么

pet*_*ter 9 java floating-point precision

我注意到Java浮点精度的一些问题

       Float.parseFloat("0.0065") - 0.001  // 0.0055000000134110451
       new Float("0.027") - 0.001          // 0.02600000000700354575
       Float.valueOf("0.074") - 0.001      // 0.07399999999999999999
Run Code Online (Sandbox Code Playgroud)

我不仅有问题,Float而且还有问题Double.

有人可以解释幕后发生的事情,我们怎样才能获得准确的数字?在处理这些问题时,处理此问题的正确方法是什么?

rua*_*akh 30

问题很简单就是float精度有限; 它不能完全代表0.0065.(double当然也是如此:它具有更高的精度,但仍然是有限的.)

进一步的问题,使上述问题更加明显,是0.001一个double而不是一个float,所以你float被提升为a double来执行减法,当然在那时系统无法恢复缺失的精度double 可以代表开始.为了解决这个问题,你会写:

float f = Float.parseFloat("0.0065") - 0.001f;
Run Code Online (Sandbox Code Playgroud)

使用0.001f而不是0.001.

  • +1提到`0.001`是一个'double`. (7认同)

wil*_*ynn 6

看看每个计算机科学家应该知道的关于浮点运算的内容.你的结果对我来说是正确的.

如果您不喜欢浮点数的工作方式,请尝试使用类似BigDecimal的方法.


Lou*_*man 5

你得到了正确的结果.没有这样的float0.027,也没有这样的double.如果您使用或,您将始终收到这些错误.floatdouble

floatdouble存储为二进制分数:类似于1/2 + 1/4 + 1/16 ......您无法将所有十进制值精确地存储为有限精度二进制分数.这在数学上是不可能的.

唯一的选择是使用BigDecimal,您可以使用它来获取精确的十进制值.