这两个调用之间有什么区别? (有什么区别吗?)
// 1. new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP)); // 2. new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
确实有很大的不同,你应该记住这一点。SetScale 确实设置了你的数字的大小,而 round 确实将你的数字四舍五入到指定的数字,但是它“从精确结果的最左边的数字开始”,就像 jdk 中提到的那样。因此,对于您的样本,结果是相同的,但尝试0.0034代替。 以下是我在博客上关于这一点的留言:
Http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
提到但没有直接提到的一个重要问题是 “精确”和 “规模”之间的区别,以及它们在这两种语句中的使用方式。Abc0是一个数字中的有效数字总数。“规模”是小数点右边的位数。
MathContext 构造函数只接受精度和 RoundingMode 作为参数,因此在第一个语句中从不指定 scale。
setScale()显然接受 scale 作为参数,以及 RoundingMode,但是在第二个语句中从未指定精度。
setScale()
如果你把小数点向右移动一位,区别就会变得很明显:
// 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