有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数学四舍五入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。知道发生了什么吗

谢谢!


共 (2) 个答案

  1. # 1 楼答案

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

    如果你想了解更多关于双精度四舍五入的信息,请勾选此other answer

  2. # 2 楼答案

    原因是,你的计算

    retvalue = (value * pow); 
    

    。。。导致

    2.495 * 100.0 = 249.4999885559082
    

    用double代替float可以解决这个问题。float和double都不是精确值,但float甚至不如double精确,更容易导致错误。如果你好奇的话,你会发现很多关于浮点算法的资料