将 BigDecimal 舍入为 *always* 有两位小数

Posted

技术标签:

【中文标题】将 BigDecimal 舍入为 *always* 有两位小数【英文标题】:Rounding BigDecimal to *always* have two decimal places 【发布时间】:2013-03-26 17:09:58 【问题描述】:

我正在尝试将 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 执行此操作?还是有其他更适合这个的类/库?

【问题讨论】:

如果你真的想四舍五入,你会使用 RoundingMode.HALF_UP 【参考方案1】:
value = value.setScale(2, RoundingMode.CEILING)

【讨论】:

这确实可以按我的意愿工作。区别仅仅是round() 使用有效数字而setScale 使用固定的小数位数还是有更多? 使用 RoundingMode.HALF_UP 进行“典型的舍入”。即 1.111 给出 1.11 [CEILING 给出 1.12] 感谢RoundingMode.HALF_UP。根据文档,这是学校通常教授的四舍五入方法——我需要的。 请注意您的值是否可能像在会计应用程序中那样为负数。您可能需要使用 RoundingMode.UP 而不是 CEILING 为什么setScale(...) 有效?见BigDecimal setScale and round。

以上是关于将 BigDecimal 舍入为 *always* 有两位小数的主要内容,如果未能解决你的问题,请参考以下文章

Math的三个将小数值舍入为整数方法

ActionScript 3 将数字舍入为X小数

c_cpp 将给定数字舍入为最接近的10的倍数

将 hh:mm:ss.00 向上舍入为 hh:mm:ss

常用函数

Math三个函数