CentOs 5.4,OpenJDK运行时环境(内部版本号1.6.0-b09)
MathContext context = new MathContext(2, RoundingMode.FLOOR);
BigDecimal total = new BigDecimal("200.0", context);
BigDecimal goodPrice = total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR);
System.out.println("divided price=" + goodPrice.toPlainString());
// prints 66.66
BigDecimal goodPrice2 = total.divide(BigDecimal.valueOf(3), new MathContext(2, RoundingMode.FLOOR));
System.out.println("divided price2=" + goodPrice2.toPlainString());
// prints 66虫子?
发布于 2010-03-27 22:40:41
第一种情况下的Javadoc:
返回一个BigDecimal,它的值是(this / divisor),其比例是指定的。如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。
第二种情况下的Javadoc:
返回一个BigDecimal,它的值是(this / divisor),根据上下文设置进行舍入。
参考我们得到的MathContext的javadoc:
封装上下文设置的
不可变对象,上下文设置描述数值运算符的某些规则,例如由BigDecimal类实现的那些规则。与基数无关的设置是: roundingMode:用于运算的位数;结果将舍入到此精度RoundingMode :一个RoundingMode对象,它指定要用于舍入的算法。
因此,在第一种情况下,您将小数位数指定为2,这意味着您将舍入到精度的2位小数点,其中舍入是作为下限函数执行的。第二次计算的指定精度为2,四舍五入为精度的两位数,其中四舍五入为下限函数。因此,在第一种情况下,您要求在小数位后输入2位数字,而在第二种情况下,您只要求输入2位数字。例如,如果你要求在你的MathContext中输入4位数字,你会得到66.66的答案。
因此,我不认为这是一个错误,因为这两个方法不执行相同的计算。
发布于 2010-03-27 22:43:33
这完全是预期的行为。我认为你犯了一个错误,把四舍五入(小数位数)和精确度混为一谈。
total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR)在这里,您将覆盖MathContext并使用舍入。
total.divide(BigDecimal.valueOf(3), new MathContext(2, RoundingMode.FLOOR))在这里,您将精度设置为2,并且仅接收2位数字。
发布于 2010-03-27 22:16:25
读取divide(BigDecimal,MathContext)方法的Javadoc,似乎只考虑了上下文的舍入模式。
https://stackoverflow.com/questions/2529526
复制相似问题