我对BigDecimal实例的划分结果有疑问。 我的节目:
public class DecimalPrecision
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);
但根据我的口味,将结果解析为String然后创建新的正确舍入的BigDecimal会出现问题。我在寻求你的帮助,如何在不诉诸任何字符串的情况下解决这个问题? 提前谢谢。
答案 0 :(得分:2)
您从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