我已经读过很多关于将数字四舍五入到小数位数的问题,然后我发现使用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.0
与2.00
不同。
这是我最好的选择吗?我想让圆角部分工作,然后区别很简单。
答案 0 :(得分:2)
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)
如果a
和b
都是浮点类型,那么
(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");
}
}
}
}