首先,这是我使用的代码:
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。知道发生了什么吗?
谢谢
答案 0 :(得分:0)
原因是你计算......
retvalue = (value * pow);
...导致......
2.495 * 100.0 = 249.4999885559082
使用double而不是float将解决该特定问题。浮点数和双精度值都不是精确值,但浮点数甚至不如双精度值更准确,并且更容易导致错误。如果你很好奇,那么你会发现很多关于浮点算术的材料。
答案 1 :(得分:0)
如果您执行2.495f * 100.0
,您会发现结果为249.4999885559082
。由于小数部分小于.5
,因此会向下舍入为249.0
,当除以100.0
时,会得到2.49
。
如果您想了解有关如何舍入双精度的更多信息,请查看此other answer。