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

-1 java double comparison

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这两个比较都将返回true,但是,A.compare将返回false.我想到的唯一原因是浮动和双重类型之间的范围和精度差异.但是,我使用的数字和EPS似乎应该在合法范围内.谢谢您的帮助.

And*_*ner 6

这是因为54.124844f + 1e-7f == 54.124844f.Float只是没有足够的精度来进行添加以产生不同的值54.124844f.

使用Math.nextAfter(float, double)显示后面的下一个更大的值54.124844f54.124847f.因此,添加一个小于此值的增量不会改变浮动.

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