BigDecimal setScale and round

这两个调用之间有什么区别? (有什么区别吗?)

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

确实有很大的不同,你应该记住这一点。SetScale 确实设置了你的数字的大小,而 round 确实将你的数字四舍五入到指定的数字,但是它“从精确结果的最左边的数字开始”,就像 jdk 中提到的那样。因此,对于您的样本,结果是相同的,但尝试0.0034代替。 以下是我在博客上关于这一点的留言:

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

提到但没有直接提到的一个重要问题是 “精确”“规模”之间的区别,以及它们在这两种语句中的使用方式。Abc0是一个数字中的有效数字总数。“规模”是小数点右边的位数。

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

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