数学圆形Java问题2.495到2位= 2.49

时间:2015-03-27 12:17:03

标签: 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) 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。知道发生了什么吗?

谢谢

2 个答案:

答案 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