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)
コメント