java 使用浮点比较会 return 错误的结果
java using float comparison will return wrong results
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));
}
}
我认为这两个比较都会 return 正确,但是 A.compare 会 return 错误。在我看来,唯一的原因是 float 和 double 类型之间的范围和精度差异。但是,我使用的数字和EPS似乎应该在合法范围内。感谢您的帮助。
这是因为54.124844f + 1e-7f == 54.124844f
。 Float 根本没有足够的精度来使该加法产生不同于 54.124844f
.
的值
使用Math.nextAfter(float, double)
表示54.124844f
之后的下一个较大的值是54.124847f
。因此,添加比该值更小的增量不会改变浮点数。
另外一个returns为真,因为_EPS2
是一个double
,所以b
在加法前被强制转换为一个double
。 double
确实有足够的精度来表示差异。
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));
}
}
我认为这两个比较都会 return 正确,但是 A.compare 会 return 错误。在我看来,唯一的原因是 float 和 double 类型之间的范围和精度差异。但是,我使用的数字和EPS似乎应该在合法范围内。感谢您的帮助。
这是因为54.124844f + 1e-7f == 54.124844f
。 Float 根本没有足够的精度来使该加法产生不同于 54.124844f
.
使用Math.nextAfter(float, double)
表示54.124844f
之后的下一个较大的值是54.124847f
。因此,添加比该值更小的增量不会改变浮点数。
另外一个returns为真,因为_EPS2
是一个double
,所以b
在加法前被强制转换为一个double
。 double
确实有足够的精度来表示差异。