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



我在看过的地方找不到ceil函数:

  • https://duckduckgo.com/?q=scala+bigdecimal+ceil+function&t=ffab&ia=qa
  • http://www.scala-lang.org/api/current/scala/math/BigDecimal.html

但我确实在 Double 和 Float 上找到了一种 ceil 方法。

我知道 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的第一个参数是精度,即要保持的有效位数。将像 1234567 这样的数字四舍五入以保留五个有效数字会得到 1234600。

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

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

我们可以使用扩充我的库模式来添加隐式BigDecimalceil方法:

implicit class RichBigDecimal(bd: BigDecimal) {
def ceil: BigDecimal = bd.setScale(0, RoundingMode.CEILING)
}
scala> BigDecimal("1.1").ceil
res6: scala.math.BigDecimal = 2

最新更新