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の四捨五入でハマったのでメモ