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

Where is the ceil function on scala.math.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,因为这些是货币操作,因此我需要精确值。

回答标题问题:没有。至少,不是以 Double 存在的方式存在(并且 确实 不存在 Double,它是隐式添加的)。

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

我们可以使用 enrich my library 模式将 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