18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

python3で小数点以下を四捨五入で計算する簡単な方法

Last updated at Posted at 2017-06-01

python3で指定した小数点位置で四捨五入で計算する方法

すぐに忘れそうなので備忘のために書いておく。
round()があるよ
小数点以下の四捨五入は簡単だけど、知らなかったので。
※切り捨て、切り上げはmathモジュールでやる(参考リンク先を参照)

デフォルトはこうなる

python3
>>> a = 1
>>> b = 6
>>> a / b
0.16666666666666666

round関数を使う

python3
>>> round((a / b), 1)
0.2
>>> round((a / b), 2)
0.17
>>> round((a / b), 3)
0.167
>>> round((a / b), 4)
0.1667

#追記
考慮の不足があったので、追記です。

python3系では端数処理により、うまく丸められないことがありました。
python3の四捨五入でハマったのでメモ
こちらの方も解決されていました。
説明なども含めてとても参考になりました。
※こちらに記載のlamdaが小数点以下1桁の解決法でしたので、本稿では2桁以上に対応します。

ただのroundで不都合が発生するのは例えばこの様な感じ。

python3
>>> round(1.1115, 3)
1.111
>>> round(1.1125, 3)
1.113

こういった場合も含めて、以下の様な関数で任意の長さのfloat型も四捨五入が可能となると思います。
※ちょっとテストが不足しているかもしれないので、もし不具合等があれば指摘ください。

python3
def custom_round(number, ndigits=0):
    if type(number) == int:#整数ならそのまま返す
        return number
    d_point = len(str(number).split('.')[1])#小数点以下が何桁あるか定義
    if ndigits >= d_point:#求める小数点以下の値が引数より大きい場合はそのまま返す
        return number
    c = (10 ** d_point) * 2
    #小数点以下の桁数分元の数に0を足して整数にして2倍するための値(0.01ならcは200)
    return round((number * c + 1) / c, ndigits)
    #元の数に0を足して整数にして2倍して1を足して2で割る。元の数が0.01なら0.015にしてroundを行う
実行例
>>> round(1.1115, 3)
1.111
>>> round(1.1125, 3)
1.113
>>>
>>> custom_round(1.1115, 3)
1.112
>>> custom_round(1.1125, 3)
1.113
>>> round(4.5)
4
>>> round(3.5)
4
>>> custom_round(4.5)
5.0
>>> custom_round(3.5)
4.0

参考リンク

Python/サンプル/小数点以下の値の操作・四捨五入や切上げ、切捨て
本家 (2. 組み込み関数 #round())
python3の四捨五入でハマったのでメモ

18
15
1

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
18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?