将BigDecimal舍入为*始终*具有两个小数位


217

我正在尝试将BigDecimal值四舍五入到小数点后两位。

我正在使用

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

但这并不能满足我的一贯要求:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

我不在乎有效数字,我只想要两位小数。我该如何使用BigDecimal?还是有另一个更适合于此的班级/图书馆?


9
如果您确实想四舍五入,则可以使用RoundingMode.HALF_UP
Gilbert Le Blanc

Answers:


401
value = value.setScale(2, RoundingMode.CEILING)

19
这确实可以满足我的要求。区别是仅round()适用于有效数字,而setScale适用于固定数目的小数位,还是更多?
布拉德·梅斯

44
使用RoundingMode.HALF_UP进行“典型舍入”。即1.111给出1.11 [上限给出1.12]
Grzegorz Dev

5
谢谢你RoundingMode.HALF_UP。根据文档,这是学校常用的四舍五入方法-我需要的是。

1
在会计应用程序中,如果您的值可能为负,请当心。您可能需要使用RoundingMode.UP而不是CEILING
Dale

1
为什么setScale(...)起作用?参见BigDecimal setScale和round
詹森·罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.