BigDecimal 值除法后的舍入问题。 Java
Issue with rounding aftrer division of BigDecimal values. Java
我对 BigDecimal 实例的除法结果有疑问。
我的程序:
public class 小数精度
public static void main(String[] args) {
MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);
System.out.println(new BigDecimal("0.1111111111111111111111111").divide(new BigDecimal("3"), mathContext).toString());
}
结果如下:
0.03703703703703703703703703
但正确的结果是:
0.03703703703703703703703704
基本上我的程序将最后一位数字 7 四舍五入为 3,而不是 4。为什么会这样?在 mathContext 中,我指定了舍入模式 HALF_UP。可能我在这个问题上知识不足,但我确信 HALF_UP 舍入到更大的值。
这个问题可以通过以下方式解决:
value1 = value1.divide(value2, 10000, RoundingMode.HALF_UP);
return new BigDecimal(value1.toString()).round(mathContext);
但在我看来,将结果解析为字符串然后创建新的适当舍入的 BigDecimal 有点不对劲。我正在寻求您的帮助,如何在不求助于任何字符串的情况下解决此问题?
提前致谢。
您从 25 位数字开始并以 25 位精度执行运算,因此您可以预期最后一位数字可能是错误的。解决方案是使用比您需要更多的数字并四舍五入结果。
BigDecimal oneNinth25 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 25, BigDecimal.ROUND_HALF_UP);
BigDecimal oneNinth26 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 26, BigDecimal.ROUND_HALF_UP);
MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);
System.out.println("1/9 to 25 digits / 3 = " +
oneNinth25.divide(BigDecimal.valueOf(3), mathContext));
System.out.println("1/9 to 26 digits / 3 = " +
oneNinth26.divide(BigDecimal.valueOf(3), mathContext));
打印
1/9 to 25 digits / 3 = 0.03703703703703703703703703
1/9 to 26 digits / 3 = 0.03703703703703703703703704
我对 BigDecimal 实例的除法结果有疑问。 我的程序:
public class 小数精度
public static void main(String[] args) {
MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);
System.out.println(new BigDecimal("0.1111111111111111111111111").divide(new BigDecimal("3"), mathContext).toString());
}
结果如下: 0.03703703703703703703703703 但正确的结果是: 0.03703703703703703703703704
基本上我的程序将最后一位数字 7 四舍五入为 3,而不是 4。为什么会这样?在 mathContext 中,我指定了舍入模式 HALF_UP。可能我在这个问题上知识不足,但我确信 HALF_UP 舍入到更大的值。
这个问题可以通过以下方式解决:
value1 = value1.divide(value2, 10000, RoundingMode.HALF_UP);
return new BigDecimal(value1.toString()).round(mathContext);
但在我看来,将结果解析为字符串然后创建新的适当舍入的 BigDecimal 有点不对劲。我正在寻求您的帮助,如何在不求助于任何字符串的情况下解决此问题? 提前致谢。
您从 25 位数字开始并以 25 位精度执行运算,因此您可以预期最后一位数字可能是错误的。解决方案是使用比您需要更多的数字并四舍五入结果。
BigDecimal oneNinth25 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 25, BigDecimal.ROUND_HALF_UP);
BigDecimal oneNinth26 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 26, BigDecimal.ROUND_HALF_UP);
MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);
System.out.println("1/9 to 25 digits / 3 = " +
oneNinth25.divide(BigDecimal.valueOf(3), mathContext));
System.out.println("1/9 to 26 digits / 3 = " +
oneNinth26.divide(BigDecimal.valueOf(3), mathContext));
打印
1/9 to 25 digits / 3 = 0.03703703703703703703703703
1/9 to 26 digits / 3 = 0.03703703703703703703703704