積雲が映像制作したMV『RANGEFINDER』公開中
専門88IO

【Python】有効桁数を指定して丸める方法

専門

decimalライブラリを使う

decimalライブラリを用いるのが正攻法。decimal.getcontext().precで計算精度を変更することができる。正直get~()で代入するのは汚く感じて好みではないがクイックスタートに載ってるから仕方ない。

import decimal

# 有効数字4桁指定
decimal.getcontext().prec = 4

a = decimal.Decimal(1)
b = decimal.Decimal(3)
print(a / b)  # >> 0.3333

ただし、注意点としてはDecimalクラスの演算に限った話であるということ。

c = decimal.Decimal(1.2345678)
print(c) # >> 1.2345677999999999929769955997471697628498077392578125

上のように初期化に用いた数値をそのまま出力するだけでは丸められない。あくまで演算結果が丸められる。回避策としては変数の直前に+を付与する等して計算式にする方法がある。

print(+c) # >> 1.235

mathライブラリを使う

とある入門記事でround関数を紹介しているものがあったので此方についても書いておく。

round関数round(number, n)のように用い、numberを小数点以下n桁で丸められる。※.5は偶数に丸められる仕様であり四捨五入ではないことに注意

これでは有効数字k桁の指定ができないので数値のスケールによって第2引数の適当な値を考える。

数値の桁数は常用対数を取ることで判別することができ、ここではmath.log10を用いる。またmath.floorは床関数、これで切り捨て処理を行う。

import math

math.floor(math.log10(1.234))   # >> 0    整数1桁
math.floor(math.log10(654.3))   # >> 2    整数3桁
math.floor(math.log10(0.0987))  # >> -2   小数2桁

上の出力から1を小数0桁と解釈するとnumberは小数-math.floor(math.log10(number))桁と表せる。

有効数字k桁で丸めたい場合はround関数の第2引数にk - math.floor(math.log10(number)) - 1を指定すれば良い。

math.log10の引数は正の数でなければならないことを加味すると以下のようになる。

# 有効数字k桁で丸める数値をxとする
round(x, k - math.floor(math.log10(abs(x)))- 1)

コメント

タイトルとURLをコピーしました