数学四舍五入Java问题2.495到2位数=2.49
首先,这是我使用的代码:
public static float roundAt(float value , int digits) {
double pow = Math.pow(10, digits);
double retvalue;
retvalue = (value * pow);
retvalue = Math.round(retvalue);
retvalue = retvalue / pow;
return (float) retvalue;
}
因此,使用这种方法,我做了以下工作
如果我将这些值四舍五入:
roundAt(0.495f,2) = 0.5
roundAt(1.495f,2) = 1.5
roundAt(2.495f,2) = 2.49
我试图理解这背后的逻辑,但我做不到。我希望每次取整都是一样的,这样我就可以用roundAt(2.495f,2)
得到2.5。知道发生了什么吗
谢谢!
# 1 楼答案
如果你做
2.495f * 100.0
,你会注意到结果是249.4999885559082
。由于小数部分小于.5
,因此四舍五入为249.0
,当除以100.0
时,得到2.49
如果你想了解更多关于双精度四舍五入的信息,请勾选此other answer
# 2 楼答案
原因是,你的计算
。。。导致
用double代替float可以解决这个问题。float和double都不是精确值,但float甚至不如double精确,更容易导致错误。如果你好奇的话,你会发现很多关于浮点算法的资料