BigDecimal setScale和舍入


140

这两个电话有什么区别?(有没有?)

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

6
除了下面接受的答案之外,setScale()创建一个BigDecimal的新对象-给定其不变的类
崩溃2015年

9
@prash round方法还返回BigDecimal的新实例,因为正如您所说,这些实例是不可变的。
daiscog

Answers:


212

提到但没有直接解决的一个重要问题是“精度”“比例”之间的区别以及它们在这两种陈述中的用法。 “精度”是数字中有效数字的总数。 “比例”是小数点右边的位数。

MathContext构造函数仅接受precision和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

38
Re:“” precision“是一个数字中的总位数。” 否。精度是有效位数。0.000042M的精度为2
大卫J.

2
请参阅:“精度”:数字计数从精确结果的最左非零数字开始。docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
涡流

如果“精度是有效位数”,那么为什么0.0000009的精度为2?应该是1
Sanchi Girotra '16

1
BigDecimal的值如何设置?您如何输出值(使用String.format()可能会隐藏有效数字)?
戴尔·彼得斯,2016年

1
@SanchiGirotra精度为“非标度值中的位数”。精度为2,无标度值为90,标度为8,则得出0.0000009。精度为1,无标度值为9,标度为
7。– daiscog

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.