java - BigDecimal 1.0E+8/100000000 ROUND_HALF_UP 为 0

标签 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

最佳答案

这一切都与所涉及的 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的范围内,四舍五入只给了两个选项:0或者10000000,所以 ROUND_HALF_UP 舍入到 0,输出 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 常量。

关于java - BigDecimal 1.0E+8/100000000 ROUND_HALF_UP 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28726012/

相关文章:

java - 使用 Spring 在 Java 中发送文本 REST 消息

excel - excel中的圆函数。如何四舍五入到特定数字?

java - 即使精度超过可用数字,格式也不打印所有两位数

java - 如何打破 Java 中的嵌套循环?

java - 在 PySpark 中为 Scala 类构造函数初始化 Scala 正则表达式

java - Java中如何将数字四舍五入到小数点后n位

Ruby 2.0 - 将整数舍入到最接近的 10 的倍数

java - 将 java BigDecimal 中的 6.51 更改为 6.50

angular - 将数字类型转换为 BigDecimal TypeScript(Angular)

java - 为什么关闭一个 jframe 窗口时其他窗口会自动关闭?