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.
你得到了正确的结果.没有这样的float0.027,也没有这样的double.如果您使用或,您将始终收到这些错误.floatdouble
float并double存储为二进制分数:类似于1/2 + 1/4 + 1/16 ......您无法将所有十进制值精确地存储为有限精度二进制分数.这在数学上是不可能的.
唯一的选择是使用BigDecimal,您可以使用它来获取精确的十进制值.
| 归档时间: |
|
| 查看次数: |
40422 次 |
| 最近记录: |