【问题标题】:Rounding BigDecimal to *always* have two decimal places将 BigDecimal 舍入为 *always* 有两位小数
【发布时间】: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

标签: java math bigdecimal rounding


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多