小数点を正しく十進法で表示する方法 – decimal / python

小数点以下を四捨五入する場合、次のように思わぬ答えが返る場合があります。


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モジュールが用意されていますので、こちらを利用する必要があります。

 

 

十進法で正確に計算する
from decimal import 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を指定することで繰り上げによる四捨五入を行うことができます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です