0

要舍入一个数字,我使用以下代码:

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
4

2 回答 2

3

这不是四舍五入的工作方式。HALF_UP 表示如果一个数字恰好在两个最接近的可用值之间(取决于比例),它将被四舍五入。其他任何值都四舍五入到最接近的值。

从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
于 2012-06-28T08:59:03.167 回答
0

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

如果你真的想要其他行为,你将不得不做类似的事情

while(number.scale() > 0) {
  number.setScale(number.scale() - 1, RoundingMode.HALF_UP);
}
于 2012-06-28T09:00:54.650 回答