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

我需要以下结果

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

.round().setScale() ? 我如何去做这件事?

您可以使用setScale()将小数位数减less到零。 假设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都会返回一个新对象。)

如果我去格罗德里格斯的答案

 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 

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

这是一个非常复杂的解决scheme,但它的工作原理:

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

testing代码:

 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

只要看看:

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); 

我不认为你可以在一个命令中这样做。 尝试

  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 

我testing了其余的例子,它会返回想要的值,但我不能保证它的正确性。

你要

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