大十进制集缩放和舍入
2022-08-31 07:07:23
这两个电话有什么区别?(有吗?
// 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);
提到但没有直接解决的一个重要点是“精度”和“刻度”之间的区别以及它们在两个语句中的使用方式。“精度”是数字中有效位数的总数。“scale”是小数点右边的位数。
MathContext 构造函数仅接受精度和舍入模式作为参数,因此从不在第一个语句中指定 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
确实有很大的区别,您应该牢记这一点。setScale 确实设置了数字的小数位数,而舍入会将数字舍入到指定的数字,但它“从精确结果的最左边的数字开始”,如 jdk 中所述。因此,关于您的样本,结果是相同的,但请尝试0.0034。这是我在博客上对此的说明:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html