我在看过的地方找不到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#round
。MathContext
的第一个参数是精度,即要保持的有效位数。将像 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
我们可以使用扩充我的库模式来添加隐式BigDecimal
ceil
方法:
implicit class RichBigDecimal(bd: BigDecimal) {
def ceil: BigDecimal = bd.setScale(0, RoundingMode.CEILING)
}
scala> BigDecimal("1.1").ceil
res6: scala.math.BigDecimal = 2