[Scala]BigDecimalで四捨五入
今回のお題は
プログラムをやってて、ある程度数値をいじる方にはもう一般的な事かもしれませんが
四捨五入です。
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というクラスは、javaのBigDecimalをラップしているようです。
使い方もほとんど同じですね。
ちなみに、
setScaleの一つ目の引数は四捨五入する位置で、0が小数点になります。
1を指定すれば、1.1のような、少数が一桁の数値になります。
二つ目の引数が、四捨五入、切り上げ、切り捨ての指定をします。
四捨五入の場合は
scala.math.BigDecimal.RoundingMode.HALF_UP
切り上げの場合は
scala.math.BigDecimal.RoundingMode.CEILING
切り捨ての場合は
scala.math.BigDecimal.RoundingMode.FLOOR