BigDecimal科学计数法字符串和普通字符串

时间:2019-01-22 01:16:36

标签: java bigdecimal

我有这段代码

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 compareb时说的是0(等于?)

1 个答案:

答案 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