这两个调用有什么区别吗?(有吗?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
这两个调用有什么区别吗?(有吗?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
提到但没有直接讨论的一个重要点是"精度"和"标度"的区别,以及它们在这两个声明中的使用。 "精度"是数字中有效位数的总数。 "标度"是小数点右侧的数字位数。
MathContext构造函数只接受精度和RoundingMode作为参数,因此在第一个语句中永远不会指定标度。
setScale()
显然接受标度和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
确实有很大的区别,这一点您应该牢记。 setScale实际上设置了您的数字的比例,而round则将数字四舍五入到指定的位数,但它“从精确结果的最左边数字开始”如jdk中所述。因此针对您的示例,结果是相同的,但请尝试0.0034。 这是我在博客上关于此的注释:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
.setScale
,而另一个则是学术命名法胜过普通人的令人分心的例子。 - MarkHu