可能重复:
Why can't decimal numbers be represented exactly in binary?
我从简单的浮动数学中得到了非常奇怪的行为。例如
//create a float with value of 1.0
float f = 1.0;
//take 0.1 from its value
f -=0.1;
前几次,当我减去0.1时,它返回0.9,0.8,0.7 ...... 然后由于某种原因它将返回0.699999999999,0.59999999999等。 说这是出乎意料的是轻描淡写。
所以为了解决这个问题,我要么知道为什么会这样做 或者类似于Round(float)的数学函数,它将数字从0.5999999舍入到0.6。
谢谢
编辑 对不起要问哈哈 任何修复?像Round(浮动)那样的东西?
其他编辑: 对于下一个问这个问题的人来说是一个修复
final DecimalFormat myFormat = new DecimalFormat("#.#");
myFormat.format(myFloatValue)
这会将myFloatValue 0.599999更改为0.6
答案 0 :(得分:1)
这是由于浮点表示的基本限制。某些数字(如0.1)不能使用有限精度的base-2算法精确表示。
答案 1 :(得分:1)
计算机是一种有限的设备,因此它以有限的精度存储浮点数。并且它将它们存储为二进制浮点数 - 相对于基数2而不是基数10.具有有限表示作为小数部分的数字不一定具有作为二进制数的有限表示,因此它必须是舍入的存储在有限的计算机中。在此示例中,0.1
将四舍五入为
0.1000000000000000055511151231257827021181583404541015625
当存储为双精度浮点数时,实际上每步中减去的位数都超过0.1
。