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
对象是不可变的; setScale
和round
都会返回一个新对象。)
如果我去格罗德里格斯的答案
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