[Scala]BigDecimalで四捨五入

2012年7月23日

今回のお題は
プログラムをやってて、ある程度数値をいじる方にはもう一般的な事かもしれませんが

四捨五入です。

Scalaで。

わかりやすいように例を挙げますと

画像サイズを比率を保ったまま縮小する処理を書いてみます。

// もとの画像のサイズ
val heightBefore = BigDecimal(2048)
val widthBefore  = BigDecimal(1506)

// 縮小後のサイズ
val widthAfter   = BigDecimal(250)

// widthを2048から250に縮小した時に、縮小後のheightを計算で求める
val heightAfter = widthAfter / widthBefore  * heightBefore

 

このような感じで「widthAfter / widthBefore」で比率を求め、heightBeforeに掛け合わせて算出します。

これをそのまま実行するとheightAfter
339.9734395750332005312084993359895

というような、数値になってしまいます。

今回の想定では、340という整数が欲しかったので、小数点を四捨五入したいと思います。

heightAfter.setScale(0, scala.math.BigDecimal.RoundingMode.HALF_UP)

これで340という数値が得られました。

このBigDecimalというクラスは、javaBigDecimalをラップしているようです。

使い方もほとんど同じですね。

ちなみに、
setScaleの一つ目の引数は四捨五入する位置で、0が小数点になります。
1を指定すれば、1.1のような、少数が一桁の数値になります。
二つ目の引数が、四捨五入、切り上げ、切り捨ての指定をします。
四捨五入の場合は
scala.math.BigDecimal.RoundingMode.HALF_UP
切り上げの場合は
scala.math.BigDecimal.RoundingMode.CEILING
切り捨ての場合は
scala.math.BigDecimal.RoundingMode.FLOOR

ScalaBigDecimal

Posted by GENDOSU