2017-03-05 8 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のために存在する方法ではありません(またの場合はは実際にはではありません)、暗黙的に追加されます。

MathContextの精度はゼロと指定しています。つまり、精度が無制限であることを意味します。つまり、丸めは行われません。真の天井(最も近い整数に丸める)を望むなら、BigDecimal#roundをまったく使用したくありません。 MathContextの最初のパラメータは、精度です。これは、維持したい有効数字の桁数です。数の上限を見つけるには、あなたに1234600.

を与えるだろう5桁を維持するために1234567のような数を切り上げ、あなたは小数点以下を維持するために桁数です規模を、設定したいです。この場合、スケールは0になります。

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 
関連する問題