比较这两个值将导致“真实”:
53.9173333333333 53.9173
如果你想要a = 1.00001
和b = 0.99999
被识别为相等:
return Math.abs(a - b) < 1e-4;
否则,如果你想要a = 1.00010
和b = 1.00019
被识别为相等,并且a
和b
都是积极的而不是巨大的:
return Math.floor(a * 10000) == Math.floor(b * 10000);
// compare by == is fine here because both sides are integral values.
// double can represent integral values below 2**53 exactly.
否则,使用truncate
中显示的Are there any functions for truncating a double in java?方法:
BigDecimal aa = new BigDecimal(a);
BigDecimal bb = new BigDecimal(b);
aa = aa.setScale(4, BigDecimal.ROUND_DOWN);
bb = bb.setScale(4, BigDecimal.ROUND_DOWN);
return aa.equals(bb);
这是一个简单的例子,如果你还需要这个:)
public static boolean areEqualByThreeDecimalPlaces(double a, double b) {
a = a * 1000;
b = b * 1000;
int a1 = (int) a;
int b1 = (int) b;
if (a1 == b1) {
System.out.println("it works");
return true;
}
else
System.out.println("it doesn't work");
return false;
天真:
if(Math.abs(a-b) < 0.0001)
但是,这对所有值都无法正常工作。只要您使用double
,实际上就不可能让它工作,因为double
实现为二进制分形,甚至没有小数位。
您必须将您的值转换为String
或BigDecimal
才能对其小数位进行有意义的测试。
您可能需要阅读the Floating-Point Guide以提高您对浮点值如何工作的理解。
Apache commons有这个:org.apache.commons.math3.util.Precision equals(double x,double y,double eps)
epsilon将是你允许的距离。看起来你的1e-5?
此方法的源代码看起来像其他答案中建议的那样使用Math.abs。
谢谢。我是这样做的:
double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println(bdLon.doubleValue());