2017-03-05 107 views
0

在我看过的地方,我无法找到小区功能: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,因为这些都是钱操作,因此我需要确切的值。

+0

我发现[斯卡拉和Java的BigDecimal(http://stackoverflow.com/a/2698794/7355)通过使用'setScale'方法部分回答问题,并将刻度更改为0并使用CEILING舍入模式。这对我很有用,但我的问题仍然存在:为什么没有简单的'ceil'方法? –

回答

1

要回答标题问题:没有。至少,不是它以Double存在的方式(并且它不存在真的存在于Double,或者它是隐含地添加的)。

您在指定MathContext的精度为零,这意味着您说您想要无限精度 - 也就是说,不会完成舍入。如果你想要真正的上限(四舍五入到最接近的整数),那么你根本不想使用BigDecimal#roundMathContext的第一个参数是精度,这是您要维护的有效位数。围捕了一些像1234567保持5个显著数字会给你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 

我们可以使用丰富我的图书馆模式为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