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

Dan*_*yen 1 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);
Run Code Online (Sandbox Code Playgroud)

结果

a equal b? 0
-1
8000
1E+5
Run Code Online (Sandbox Code Playgroud)

我不明白吗?为什么a 8000000/1000和round up不同80e5/1000和舍入?和Java在表示第一次a compareb是0(等于?)

Jon*_*oni 5

divide您正在使用的方法将结果的比例设置为原始对象的比例:

BigDecimal.divide(BigDecimal,int)

返回一个BigDecimal,其值为(this/divisor),其标度为this.scale().如果必须执行舍入以生成具有给定比例的结果,则应用指定的舍入模式.

由于您b从"80e5" 创建它的比例为-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
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以在划分时为结果设置所需的比例:

jshell> b.divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_UP);
$7 ==> 8000
Run Code Online (Sandbox Code Playgroud)