我有这段代码
BigDecimal a = new BigDecimal("8000000");
BigDecimal b = new BigDecimal("80e5");
System.out.println("a equal b? " +a.compareTo(b));
BigDecimal resultA = a.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);
BigDecimal resultB = b.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);
System.out.println(resultA.compareTo(resultB));
System.out.println(resultA);
System.out.println(resultB);
结果
a equal b? 0
-1
8000
1E+5
我不明白吗?为什么8000000/1000
和四舍五入与80e5/1000
和四舍五入不同? Java在第一次a
compare
至b
时说的是0(等于?)
答案 0 :(得分:5)
您使用的divide
方法将结果的比例设置为原始对象的比例:
BigDecimal.divide(BigDecimal, int)
返回一个BigDecimal,其值为(this / divisor),其标度为this.scale()。如果必须进行舍入以产生给定比例的结果,则将应用指定的舍入模式。
自从“ 80e5”创建b
以来,其比例为-5,并且divide
必须将其结果四舍五入为1e + 5:
jshell> var b = new BigDecimal("80e5");
b ==> 8.0E+6
jshell> b.scale()
$4 ==> -5
jshell> var c = b.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);
c ==> 1E+5
jshell> c.scale()
$6 ==> -5
要解决此问题,您可以在除法时设置结果的比例尺:
jshell> b.divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_UP);
$7 ==> 8000