毎回調べちゃうよね、この処理。
めんどくさいのでまとめました。
四捨五入
Decimal.quantize() を使います。
Decimalってなに?
小数を表現するための型の一つです。
ふだんはfloat
でも構わないのですが、この子は小数部の桁があまりにも膨れてしまった場合、正確に表現できなくなってしまうという短所を持ちます。
これを解決するため、一般的な手計算と同じ数値を返すことのできる小数型としてデザインされたのがDecimalになります。
使ってみる
Decimal型はモジュールなので、まずはインポートします。
>>> from decimal import *
そしたら試しに四捨五入させてみましょう。
今回は1.2345
を小数点第4位で四捨五入してみます。
>>> d = Decimal("1.2345") # 必ず文字列で渡す
>>> d = d.quantize(Decimal(".001"), rounding=ROUND_HALF_UP)
>>> print(d)
1.235
こんな感じです。
ちゃんと小数点第4位が四捨五入され、切り上げられて1.235
になっているのが確認できます。
手順としては、
-
Decimal(number)
でDecimal型のオブジェクトを作る -
Decimal.quantize(有効桁、rounding=ROUND_HULF_UP)
で四捨五入
となります。
似たような処理にround
関数がありますが、こちらは偶数丸めを行うものです。
一般的には四捨五入と同じふるまいを見せますが、1.5
や1.25
のように 最終桁が5である(切り上げと切り捨ての結果が同様に近い) 場合、結果の最終桁が偶数となるような処理を行います。
>>> round(0.5)
0
>>> round(1.25, 1)
1.2
コメントにて修正いただきました。ありがとうございます
有効桁を指定する
すこしわかりにくいですが、有効桁の指定にはDecimal型のオブジェクトを渡します。
有効桁の最後の桁に1
を置き、それ以外の桁を0
で埋めることで有効桁を表現します。
丸め形式について
第二引数にrounding
というプロパティを指定していますが、これは丸め形式というものです。
今回用いたROUND_HALF_UP
は、0.5
のような閾値の場合切り上げるという指定になります。
先述したround()
関数と同じ挙動をしたい場合はROUNDING_HALF_EVEN
を指定してあげましょう。