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
BUG?
Javadoc第一种情况:
返回一个BigDecimal,其值为(this/divisor),其scale是指定的.如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式.
和第二种情况的Javadoc:
返回一个BigDecimal,其值为(this/divisor),根据上下文设置进行舍入.
我们得到的是MathContext的javadoc:
不可变对象,它封装了描述数值运算符某些规则的上下文设置,例如由BigDecimal类实现的规则.与基础无关的设置为:precision:用于操作的位数; 结果四舍五入到此精度roundingMode:一个RoundingMode对象,它指定用于舍入的算法.
因此,在第一种情况下,您指定SCALE为2,这意味着您将舍入到精度的2位小数,其中舍入作为floor函数执行.第二个计算具有指定的PRECISION为2,其四舍五入为精度的两位数,其中舍入为floor函数.因此,在第一种情况下,您要求小数位后的 2位数,而在第二种情况下,您只需要2位数.例如,如果您在MathContext中要求4位数字,则在回答时会得到66.66.
所以我认为这不是一个错误,因为这两个方法不执行相同的计算.