使用ROUND_HALF_UP的BigDecimal 1.0E + 8/100000000为0

时间:2015-02-25 17:45:02

标签: java rounding bigdecimal divide

有人可以解释为什么第一行的结果为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

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 BigDecimals时,商会获取调用divide的对象的比例。因此,商的比例也是-7。结果计算为1,但在-7的范围内,舍入仅提供两个选项:010000000,因此ROUND_HALF_UP舍入到0 {1}},输出0E+7

当您subtract BigDecimals时,差异将取减数字的最大比例。所以,差异的比例是0。结果计算为10的比例不会强制进行舍入。输出为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常量。