java使用float比较会返回错误的结果

class A
{
    public final static float _EPS = 1E-7f;
    public final static double _EPS2 = 1E-7;

    public static boolean compare(float a, float b)
    {
        return a < b + _EPS;
    }
    public static boolean compare2(float a, float b)
    {
        return a < b + _EPS2;
    }

    public static void main(String [] main)
    {
        float a = 54.124844f;
        float b = 54.124844f;
        System.out.println("compare 1: " + A.compare(a,  b) + " comapre 2: " + A.compare2(a, b));
    }
}

我认为这两个比较都会返回true,但是,A.compare将返回false。 在我看来,唯一的原因是float和double类型的范围和精度不同。 但是,似乎我使用的数字和EPS应该在法定范围内。 谢谢您的帮助。


这是因为54.124844f + 1e-7f == 54.124844f 。 Float根本没有足够的精度来补充该值,从而产生与54.124844f不同的值。

使用Math.nextAfter(float, double)表明54.124844f 54.124847f的下一个较大值是54.124847f 。 因此,添加一个比这更小的增量不会改变浮点数。

另一个返回true,因为_EPS2是一个double ,所以在加法之前b被强制为一个doubledouble确实有足够的精度来表示差异。

链接地址: http://www.djcxy.com/p/58537.html

上一篇: java using float comparison will return wrong results

下一篇: Less or equal for floats in R