scala.math.BigDecimal 上的 ceil 函数在哪里?
Where is the ceil function on scala.math.BigDecimal?
我在我看过的地方找不到 ceil 函数:
- https://duckduckgo.com/?q=scala+bigdecimal+ceil+function&t=ffab&ia=qa
- http://www.scala-lang.org/api/current/scala/math/BigDecimal.html
但我确实找到了 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#round
。 MathContext
的第一个参数是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
我在我看过的地方找不到 ceil 函数:
- https://duckduckgo.com/?q=scala+bigdecimal+ceil+function&t=ffab&ia=qa
- http://www.scala-lang.org/api/current/scala/math/BigDecimal.html
但我确实找到了 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#round
。 MathContext
的第一个参数是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