n a*_*n a 84 java rounding bigdecimal
我需要以下结果
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
Run Code Online (Sandbox Code Playgroud)
.round()还是.setScale()?我该怎么做?
Gro*_*uez 142
您可以使用setScale()将小数位数减少到零.假设value保持要舍入的值:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Run Code Online (Sandbox Code Playgroud)
使用round()更复杂,因为它要求您指定要保留的位数.在您的示例中,这将是3,但这对所有值都无效:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
Run Code Online (Sandbox Code Playgroud)
(请注意,BigDecimal对象是不可改变的,既setScale和round,会返回一个新的对象)
n a*_*n a 10
如果我按照格罗德里格斯的回答
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Run Code Online (Sandbox Code Playgroud)
这是输出
100.23 -> 100
100.77 -> 101
Run Code Online (Sandbox Code Playgroud)
这不是我想要的,所以我最终做到了这一点..
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Run Code Online (Sandbox Code Playgroud)
这就是我得到的
100.23 -> 100.00
100.77 -> 101.00
Run Code Online (Sandbox Code Playgroud)
这解决了我现在的问题.. :)谢谢大家.
这是一个非常复杂的解决方案,但它的工作原理:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
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());
}
Run Code Online (Sandbox Code Playgroud)
输出:
100
100
101
101