scala.math.BigDecimal上的ceil函数在哪里?

时间:2017-03-05 00:04:18

标签: scala bigdecimal

我在我看过的地方找不到ceil功能:

但我找到了ceil method on Double and Float

我知道MathContext可以使用天花板舍入模式,但我似乎无法使其工作:

scala> BigDecimal("1.1").round(new MathContext(0, RoundingMode.UP))
res2: scala.math.BigDecimal = 1.1

scala> BigDecimal("1.8").round(new MathContext(0, RoundingMode.UP))
res3: scala.math.BigDecimal = 1.8

scala> BigDecimal("1.8").round(new MathContext(0, RoundingMode.CEILING))
res5: scala.math.BigDecimal = 1.8

scala> BigDecimal("1.8", new MathContext(0, RoundingMode.CEILING))
res6: scala.math.BigDecimal = 1.8

scala> res6.rounded
res8: scala.math.BigDecimal = 1.8

我预计上面所有操作的结果都是== BigDecimal(2)

我使用BigDecimal,因为这些是金钱操作,因此我需要准确的值。

1 个答案:

答案 0 :(得分:3)

回答标题问题:没有。至少,不是Double存在的方式(而且Double也不存在 ,它也会隐式添加)

您将MathContext的精度指定为零,这意味着您要求无限精度 - 也就是说,不会进行舍入。如果你想要真正的上限(四舍五入到最接近的整数),那么你根本不想使用BigDecimal#roundMathContext的第一个参数是 precision ,这是您要维护的有效位数。将1234567这样的数字四舍五入以保持5位有效数字会得到1234600.

要查找数字的上限,您需要设置 scale ,这是小数点后要保留的位数。在这种情况下,您需要一个零刻度。

import scala.math._, BigDecimal._

scala> BigDecimal("3134.1222").setScale(0, RoundingMode.CEILING)
res1: scala.math.BigDecimal = 3135

scala> BigDecimal("1.1").setScale(0, RoundingMode.CEILING)
res2: scala.math.BigDecimal = 2

scala> BigDecimal("1.8").setScale(0, RoundingMode.CEILING)
res3: scala.math.BigDecimal = 2

我们可以使用丰富我的库模式隐式地向ceil添加BigDecimal方法:

implicit class RichBigDecimal(bd: BigDecimal) {
  def ceil: BigDecimal = bd.setScale(0, RoundingMode.CEILING)
}

scala> BigDecimal("1.1").ceil
res6: scala.math.BigDecimal = 2