有人可以解释为什么第一行的结果为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
答案 0 :(得分:13)
这一切都与所涉及的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
{1}},输出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
常量。