小数点以下を四捨五入する場合、次のように思わぬ答えが返る場合があります。
ave_v = round (1.25,1)
print(ave_v)
>>>1.2 ← 1.3のはずが・・
ave_v = round (1.35,1)
print(ave_v)
>>>1.4 ← 合ってる
ave_v = round (1.45,1)
print(ave_v)
>>>1.4 ← 1.5 のはずが・・
私たちが使い慣れているのは10進数での数値表現ですが、コンピュータは2進数で数値を表現します。
10進数と2進数の間の変換には誤差が伴います。
ひとつの誤差は小さいものでも、計算の過程で蓄積されていくと、最後には大きな差になる可能性もあります。
また、if により条件分岐させる場合、
AとBが一致するはずが、不一致とされて異なる処理になってしまう可能性もあります。
A = 0.1
B = 0.2
C = 0.3
if A+B==C:
print(‘OK’)
else:
print(‘NO’)
>>> NO ← OK のはずなのに・・
これは「A+B」で返る値が微小に異なるからです。
A = 0.1
B = 0.2
print(A+B)
>>> 0.30000000000000004
財務においては、数値は正確に算出しなければなりません。
Pythonでは浮動小数点数の値を正確に計算することができるdecimalモジュールが用意されていますので、こちらを利用する必要があります。
A = Decimal(“0.1”)
B = Decimal(“0.2”)
print(A + B)
>>> 0.3
解説
import 文によりDecimal モジュールをインポートします。
「import decimal 」
とだけで記述してもよいのですが、その場合には
A= decimal. Decimal (“0.1”)
のように、「decimal. Decimal」と記述する必要があります。
Decimal ( ) には数値が入りますが、「” ” 」または「’ ‘ 」を付けて文字列とする必要があります。
Decimal(“0.1”)の代わりに、Decimal( str(0.1) ) としてもOKです。
文字列としなかった場合、エラーが出てくれれば間違いに気づきますが、
次のようにエラーが出ずに誤差が出てしまうので注意が必要です。
A = Decimal(0.1)
B = Decimal(0.2)
print(A + B)
>>> 0.3000000000000000166533453694
from decimal import Decimal, ROUND_HALF_UP
A=Decimal(“1.456”).quantize(Decimal(“0”),rounding=ROUND_HALF_UP)
print(A)
>>>1
B=Decimal(“1.456”).quantize(Decimal(“0.1”),rounding=ROUND_HALF_UP)
print(B)
>>>1.5
C=Decimal(“1.456”).quantize(Decimal(“0.01”),rounding=ROUND_HALF_UP)
print(C)
>>>1.46
解説
四捨五入する場合には、
decimalモジュールの「quantizeメソッド」を使用することで、小数点を指定した桁数で丸めることができます。
from decimal import Decimal, ROUND_HALF_UP
モジュールをインポートします。
Decimal(“ ”).
対象となる値を入力します。
quantize(Decimal(“ ”)
整数で丸める場合には、quantize(Decimal(“0”)とします。
小数点第1位まで求める場合には、quantize(Decimal(“0.1”)とします。
小数点第2位まで求める場合には、quantize(Decimal(“0.01”)とします。
rounding=ROUND_HALF_UP
引数roundingにROUND_HALF_UPを指定することで繰り上げによる四捨五入を行うことができます。