双重计算中的舍入问题

时间:2015-03-29 00:16:28

标签: java double

    double pine = 2.5;
    double alp = 2.54 - pine;
    System.out.println( "alp is " + alp);
    if (alp == 0.04){
        System.out.println ("true");
    }else{
        System.out.println ("false");
    }

我对编程(和这个网站)相对较新,我只是遇到了这个问题,试图计算双值...在上面的代码中,到目前为止,搜索的一天,我知道alp是0.0400000000000。 ..36因为双值必须用2的幂来存储它们的数字......

但是,我想这样做,以便上面的if语句打印“true”(即将alp视为0.04)。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:3)

您可以像这样比较它们(precision取决于应用程序):

double pine = 2.5;
double alp = 2.54 - pine;
double precision = 0.0000001;
System.out.println( "alp is " + alp);

if (Math.abs(alp - 0.04) <= precision) {
    System.out.println ("true");
}else{
    System.out.println ("false");
}

或者你可以使用Java的BigDecimal类:

BigDecimal pine = new BigDecimal("2.5");
BigDecimal alp = new BigDecimal("2.54");
alp = alp.subtract(pine);
if (alp.compareTo(new BigDecimal("0.04"))) {
    System.out.println ("true");
}else{
    System.out.println ("false");
}

建议使用String构造函数以避免错误。

答案 1 :(得分:1)

试试这个:

double pine = 2.5;
double alp = 2.54 - pine;
alp = Math.round(alp * 100.0) / 100.0;
System.out.println( "alp is " + alp);
if (alp == 0.04) {
    System.out.println ("true");
} else {
    System.out.println ("false");
}

答案 2 :(得分:1)

待办事项

...
if(Math.abs(alp - 0.04) < 0.0000000001){//some really small number
  System.out.println("true");
}
...

答案 3 :(得分:1)

您可以使用DecimalFormat并设置预期的格式。或者像其他人建议的那样,使用BigDecimal类。

DecimalFormat newFormat = new DecimalFormat("#.##");
double pine = 2.5;
double alp = Double.valueOf(newFormat.format(2.54 - pine));
System.out.println( "alp is " + alp);

if (alp == 0.04){
    System.out.println ("true");
}else{
    System.out.println ("false");
}