数学四舍五入Java问题2.495到2位数=2.49

数学四舍五入Java问题2.495到2位数=2.49,java,math,rounding,digit,Java,Math,Rounding,Digit,首先,这是我使用的代码: 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)

首先,这是我使用的代码:

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
我试图理解这背后的逻辑,但我不能。我希望每次取整都是一样的,这样我就可以用
取整得到2.5(2.495f,2)
。知道发生了什么吗


谢谢

原因是,您

retvalue = (value * pow); 
…导致

2.495 * 100.0 = 249.4999885559082

使用double而不是float将解决该特定问题。float和double都不是精确值,但float甚至不如double精确,更容易导致错误。如果你好奇,你会发现很多关于浮点运算的资料。

如果你想
2.495f*100.0
你会注意到结果是
249.4999885559082
。由于小数部分小于
.5
,因此四舍五入为
249.0
,除以
100.0
,得到
2.49

如果您想了解有关如何舍入双精度的更多信息,请选中此项