为什么 BigDecimal divide 在它应该适合有效数字时会导致舍入?
Why does BigDecimal divide cause rounding when it should fit within the significant digits?
为什么 BigDecimal 除法会导致四舍五入,即使该值应该适合 4 位有效数字?
BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4));
// 1.25
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4));
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP);
// 0.01
通过设置方法调用的精度,可以使除法的行为像我想要的那样,但这并不能解释为什么它还没有这样做。
realPercent.divide(percentDivider, 4, BigDecimal.ROUND_HALF_UP)
// 0.0125
通过在此处的除法调用中明确设置舍入模式:
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP);
您覆盖了使用过的 MathContext
。如果您立即指定带舍入模式的 MathContext
,它会按预期工作:
BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4, RoundingMode.HALF_UP));
// 1.25
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4, RoundingMode.HALF_UP));
realPercent = realPercent.divide(percentDivider);
//0.0125
来自divide(BigDecimal, RoundingMode)
的Javadoc:
Returns a BigDecimal
whose value is (this / divisor)
, and whose scale is this.scale()
最后一部分很重要 - 初始值的比例为 2(未缩放的值为 125)。因为您调用了固定比例的重载,所以最接近的结果是比例=2,未缩放=1,即 0.01.
为什么 BigDecimal 除法会导致四舍五入,即使该值应该适合 4 位有效数字?
BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4));
// 1.25
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4));
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP);
// 0.01
通过设置方法调用的精度,可以使除法的行为像我想要的那样,但这并不能解释为什么它还没有这样做。
realPercent.divide(percentDivider, 4, BigDecimal.ROUND_HALF_UP)
// 0.0125
通过在此处的除法调用中明确设置舍入模式:
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP);
您覆盖了使用过的 MathContext
。如果您立即指定带舍入模式的 MathContext
,它会按预期工作:
BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4, RoundingMode.HALF_UP));
// 1.25
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4, RoundingMode.HALF_UP));
realPercent = realPercent.divide(percentDivider);
//0.0125
来自divide(BigDecimal, RoundingMode)
的Javadoc:
Returns a
BigDecimal
whose value is(this / divisor)
, and whose scale isthis.scale()
最后一部分很重要 - 初始值的比例为 2(未缩放的值为 125)。因为您调用了固定比例的重载,所以最接近的结果是比例=2,未缩放=1,即 0.01.