使用setScale()方法舍入BigDecimal:意外结果

时间:2012-06-28 08:54:25

标签: java rounding bigdecimal

要对数字进行舍入,我使用以下代码:

public static roundBd(BigDecimal bd){
  BigDecimal result1 = bd.setScale(0, RoundingMode.HALF_UP);
  return result1;
}
  • 输入1.50 - >输出2
  • 输入1.499 - >输出1

第一个结果对我来说没问题,但第二个结果不是我的预期。 即使对于1.499我也希望输出2.(详细说明:首先我想将1.499转为1.50然后再转为1.5,最后转为2)

但是....

BigDecimal bd = new BigDecimal("1.499");  // I'd like to round it to 2
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50
BigDecimal result2 = bd.setScale(1, RoundingMode.HALF_UP); // result2 == 1.5
BigDecimal result3 = bd.setScale(0, RoundingMode.HALF_UP); // result3 == 1

2 个答案:

答案 0 :(得分:3)

这不是四舍五入的方式。 HALF_UP表示如果一个数字正好位于2个最接近的可用值之间(取决于比例),则将向上舍入。其他任何内容都会四舍五入到最接近的值。

摘自the javadoc

  

舍入模式向"最近邻居"除非两个邻居都是等距的

为了达到您所需的行为,您可以连续进行轮次,但我不确定为什么您想要这样的行为:

BigDecimal bd = new BigDecimal("1.499");  // I'd like to round it to 2
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50
BigDecimal result2 = result1.setScale(0, RoundingMode.HALF_UP); // result2 == 2

答案 1 :(得分:0)

这个结果正是 得到的结果;舍入每个中间牺牲精度,因此它直接舍入到正确的位数。

如果您真的想要其他行为,则必须执行类似

的操作
while(number.scale() > 0) {
  number.setScale(number.scale() - 1, RoundingMode.HALF_UP);
}