163

这两个调用有什么区别?(有没有?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
4

2 回答 2

248

提到但未直接解决的一个重要点是“精度”“比例”之间的区别以及它们在两个语句中的使用方式。 “精度”是数字中有效数字的总数。 “刻度”是小数点右侧的位数。

MathContext 构造函数只接受精度和 RoundingMode 作为参数,因此从不在第一条语句中指定比例。

setScale()显然接受 scale 作为参数,以及 RoundingMode,但是在第二个语句中从未指定精度。

如果将小数点向右移动一位,差异将变得清晰:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456
于 2012-11-19T20:03:00.690 回答
54

确实有很大的不同,你应该记住这一点。setScale 确实设置了您的数字的比例,而 round 确实将您的数字四舍五入到指定的数字,但它“从确切结果的最左边数字开始”,如 jdk 中所述。因此,对于您的样本,结果是相同的,但请尝试使用 0.0034。这是我在博客上的注释:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

于 2011-06-27T16:20:07.557 回答