将 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* 有两位小数的主要内容,如果未能解决你的问题,请参考以下文章