当前位置:  开发笔记 > 编程语言 > 正文

BigDecimal,division和MathContext - 非常奇怪的行为

如何解决《BigDecimal,division和MathContext-非常奇怪的行为》经验,为你挑选了1个好方法。

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?



1> Scott Fines..:

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.

所以我认为这不是一个错误,因为这两个方法不执行相同的计算.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有