首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigDecimal,division & MathContext -非常奇怪的行为

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

Stack Overflow用户
提问于 2010-03-27 21:59:18
回答 3查看 7.4K关注 0票数 2

CentOs 5.4,OpenJDK运行时环境(内部版本号1.6.0-b09)

代码语言:javascript
复制
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

虫子?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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的答案。

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

票数 9
EN

Stack Overflow用户

发布于 2010-03-27 22:43:33

这完全是预期的行为。我认为你犯了一个错误,把四舍五入(小数位数)和精确度混为一谈。

代码语言:javascript
复制
total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR)

在这里,您将覆盖MathContext并使用舍入。

代码语言:javascript
复制
total.divide(BigDecimal.valueOf(3), new MathContext(2,    RoundingMode.FLOOR))

在这里,您将精度设置为2,并且仅接收2位数字。

票数 2
EN

Stack Overflow用户

发布于 2010-03-27 22:16:25

读取divide(BigDecimal,MathContext)方法的Javadoc,似乎只考虑了上下文的舍入模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2529526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档