BigDecimal setScale和round

use*_*ser 132 java bigdecimal

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

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

dal*_*ers 201

提到但未直接解决的一个重点是"精确""规模"之间的区别以及它们在两个陈述中的使用方式. "precision"是数字中有效数字的总数. "scale"是小数点右边的位数.

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
Run Code Online (Sandbox Code Playgroud)

  • Re:""precision"是数字中的总位数." 编号精确是有效位数.0.000042M的精度为2. (36认同)
  • 请参阅:“精度”:数字计数从精确结果的最左边的非零数字开始。https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html (3认同)

小智 51

确实存在很大差异,您应该牢记这一点.setScale确实设置了你的数字的比例,而round会将你的数字四舍五入到指定的数字但是它"从精确结果的最左边的数字开始",如jdk中所述.因此,对于您的样本,结果是相同的,但请尝试0.0034.以下是我在博客上的说明:

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