6
3

More than 1 year has passed since last update.

[Python]四捨五入

Last updated at Posted at 2023-01-06

毎回調べちゃうよね、この処理。
めんどくさいのでまとめました。

四捨五入

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になっているのが確認できます。

手順としては、

  1. Decimal(number)でDecimal型のオブジェクトを作る
  2. Decimal.quantize(有効桁、rounding=ROUND_HULF_UP)で四捨五入

となります。

似たような処理にround関数がありますが、こちらは偶数丸めを行うものです。
一般的には四捨五入と同じふるまいを見せますが、1.51.25のように 最終桁が5である(切り上げと切り捨ての結果が同様に近い) 場合、結果の最終桁が偶数となるような処理を行います。

>>> round(0.5)
0

>>> round(1.25, 1)
1.2

コメントにて修正いただきました。ありがとうございます:clap:

有効桁を指定する

すこしわかりにくいですが、有効桁の指定にはDecimal型のオブジェクトを渡します
有効桁の最後の桁に1を置き、それ以外の桁を0で埋めることで有効桁を表現します。

丸め形式について

第二引数にroundingというプロパティを指定していますが、これは丸め形式というものです。

今回用いたROUND_HALF_UPは、0.5のような閾値の場合切り上げるという指定になります。
先述したround()関数と同じ挙動をしたい場合はROUNDING_HALF_EVENを指定してあげましょう。

6
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3