将两个浮点数与Java中的舍入值进行比较(Big Java Ex 5.3)

时间:2016-07-26 15:32:07

标签: java

我已经读过很多关于将数字四舍五入到小数位数的问题,然后我发现使用BigDecimal非常好  但是,我在本书中的下列练习中遇到了一些麻烦,请考虑以下输入和输出

Enter two floating-point numbers:
2.0
1.99998

//output
They are the same when rounded to two decimal places.
They differ by less than 0.01.

Enter two floating-point numbers:
0.999
0.991

//output
They are different when rounded to two decimal places.
They differ by less than 0.01.

我的代码

public class test{
    public static void main(String [] args ){
        Scanner getNum = new Scanner(System.in);
        Scanner getNumTwo = new Scanner(System.in);

        BigDecimal a = getNum.nextBigDecimal();
        float b = getNum.nextFloat();

        BigDecimal valBNew = new BigDecimal(b).setScale(2,BigDecimal.ROUND_HALF_UP);
        BigDecimal valANew = a;
        System.out.println(valBNew); // 2.00
        System.out.println(a); //2.0
        if (valBNew == a){
            System.out.println("They are the same when rounded to two decimal places");
        }
        else{
            System.out.println("They are different when rounded to two decimal places");
        }

    }
}

继承我的尝试。我在使用两个浮点数然后使用大小数时遇到问题。然后我的if语句出现问题,因为2.02.00不同。

这是我最好的选择吗?我想让圆角部分工作,然后区别很简单。

3 个答案:

答案 0 :(得分:2)

来自BigDecimal documentation

  

public int compareTo(BigDecimal val)

     

将此BigDecimal与指定的BigDecimal进行比较。这个方法认为两个值相等但具有不同比例(如2.0和2.00)的BigDecimal个对象。

然而,对于.equals

  

public boolean equals(Object x)

     

将此BigDecimal与指定的Object进行比较以获得相等性。与compareTo不同,此方法只考虑两个BigDecimal对象的值和规模相等(因此通过此方法比较时2.0不等于2.00)。

因此,这是正确的

if (valBNew.compareTo(a) == 0) {

}

答案 1 :(得分:0)

如果ab都是浮点类型,那么

(long)(a * 100 + 0.5) == (long)(b * 100 + 0.5)

是对2-decimal-place-rounding相等的充分测试,只要你没有溢出long类型,并且你能够容忍二进制浮点的限制。 0.5常量实现了德语舍入。

答案 2 :(得分:0)

根据@ cricket_007 -s的答案,这就是一个干净的解决方案的样子:

public class Test {
    public static void main(String [] args ) {
        try (Scanner getNum = new Scanner(System.in)) { // try-with-resources, e.g. it auto-closes the scanner
            double a = Double.parseDouble(getNum.next()); // parsing a number from a line
            double b = Double.parseDouble(getNum.next());

            BigDecimal valBNew = new BigDecimal(b); // 2.00, no rounding
            BigDecimal valANew = new BigDecimal(a); // 2.0
            if (valBNew.compareTo(valANew) == 0) { // this is the magic
                System.out.println("They are the same");
            } else {
                System.out.println("They are different");
            }
        }
    }
}