我有这段代码
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 compare来b是0(等于?)
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)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |