Java BigDecimal:舍入到最接近的整数值

时间:2010-11-09 13:17:57

标签: java rounding bigdecimal

我需要以下结果

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round().setScale()?我该怎么做?

6 个答案:

答案 0 :(得分:136)

您可以使用setScale()将小数位数减少为零。假设value保持要舍入的值:

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);

使用round()需要更多参与,因为它要求您指定要保留的位数。在您的示例中,这将是3,但这对所有值都无效:

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

(请注意BigDecimal个对象是不可变的; setScaleround都将返回一个新对象。)

答案 1 :(得分:10)

如果我按照格罗德里格斯的回答

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

这是输出

100.23 -> 100
100.77 -> 101

这不是我想要的,所以我最终做到了这一点..

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

这就是我得到的

100.23 -> 100.00
100.77 -> 101.00

这解决了我现在的问题.. :) 谢谢大家。

答案 2 :(得分:5)

这是一个非常复杂的解决方案,但它确实有效:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}

测试代码:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}

<强>输出:

  

100
  100个
  101个
  101

答案 3 :(得分:3)

只需看看:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

setScale(int precision, int roundingMode)

或者如果使用Java 6,那么

http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

和其中之一:

setScale(int precision, RoundingMode mode);
round(MathContext mc);

答案 4 :(得分:0)

我不认为你可以在一个命令中将其舍入。试试

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

我测试了其余的示例并返回了所需的值,但我不保证其正确性。

答案 5 :(得分:-2)

你想要

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP