Java:检查两个双精度值是否与特定的小数位数匹配

问题描述 投票:6回答:5

比较这两个值将导致“真实”:

53.9173333333333  53.9173
java double
5个回答
18
投票

如果你想要a = 1.00001b = 0.99999被识别为相等:

return Math.abs(a - b) < 1e-4;

否则,如果你想要a = 1.00010b = 1.00019被识别为相等,并且ab都是积极的而不是巨大的:

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);

6
投票

这是一个简单的例子,如果你还需要这个:)

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;

3
投票

天真:

if(Math.abs(a-b) < 0.0001)

但是,这对所有值都无法正常工作。只要您使用double,实际上就不可能让它工作,因为double实现为二进制分形,甚至没有小数位。

您必须将您的值转换为StringBigDecimal才能对其小数位进行有意义的测试。

您可能需要阅读the Floating-Point Guide以提高您对浮点值如何工作的理解。


3
投票

Apache commons有这个:org.apache.commons.math3.util.Precision equals(double x,double y,double eps)

epsilon将是你允许的距离。看起来你的1e-5?

此方法的源代码看起来像其他答案中建议的那样使用Math.abs。


0
投票

谢谢。我是这样做的:

double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);

System.out.println(bdLon.doubleValue());
© www.soinside.com 2019 - 2024. All rights reserved.