谁能解释一下为什么第一行的结果是 0?
System.out.println((new BigDecimal("1.0E+8")).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
System.out.println((new BigDecimal("1.0E+8")).subtract(BigDecimal.ONE).divide(new BigDecimal(100000000), BigDecimal.ROUND_HALF_UP));
0E+7
1
最佳答案
这一切都与所涉及的 BigDecimal
的比例有关。
当您在 constructor that takes a String
中指定指数格式时,尺度可能是负的。这表明有效数字并没有一直向下延伸到统一。
BigDecimal oneEPlus8 = new BigDecimal("1.0E+8");
System.out.println(oneEPlus8.scale());
这会输出 -7
。
使用 constructor that takes an int
产生 0
的比例。
BigDecimal oneHundredMillion = new BigDecimal(100000000);
System.out.println(oneHundredMillion.scale());
这会输出 0
。
当你divide
BigDecimal
s ,商采用调用 divide
的对象的比例。所以,商的小数位数也是-7
。结果被计算为1
,但是在-7
的范围内,四舍五入只给了两个选项:0
或者10000000
,所以 ROUND_HALF_UP
舍入到 0
,输出 0E+7
。
当你subtract
BigDecimal
s ,差异取被减去的数字的最大值。因此,差异的比例为 0
。结果计算为1
,0
的小数位数不强制舍入。输出为 1
。
要获得结果 1
而不必减去 1
,您可以减去 0
,或者您可以调用 setScale(0 )
在 oneEPlus8
上。
oneEPlus8 = oneEPlus8.setScale(0);
System.out.println(oneEPlus8.divide(oneHundredMillion, BigDecimal.ROUND_HALF_UP));
这个输出:
1
顺便说一句,您可以使用 divide(BigDecimal, RoundingMode)
划分指定 RoundingMode
枚举而不是旧的 int
常量。
关于java - BigDecimal 1.0E+8/100000000 ROUND_HALF_UP 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28726012/