99

我需要以下结果

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

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

4

6 回答 6

171

您可以使用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返回一个新对象。)

于 2010-11-09T13:29:38.450 回答
15

如果我按照 Grodriguez 的回答

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

这暂时解决了我的问题.. :) 谢谢大家。

于 2010-11-09T13:51:36.907 回答
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

于 2010-11-09T13:33:04.177 回答
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);
于 2010-11-09T13:33:57.860 回答
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

我测试了你的其余示例,它返回了想要的值,但我不保证它的正确性。

于 2010-11-09T13:29:55.373 回答
-2

你要

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP
于 2010-11-09T13:33:30.480 回答