Pythonの浮動小数点数(float)型:基本、指数表記、そして計算誤差の注意点

Pythonで数値を扱う際、10-5 のような整数(int)の他に、3.140.5 のような小数点を含む数値を扱う必要があります。これらを**浮動小数点数型(float)**と呼びます。

float は、科学技術計算、統計、あるいは単に割り算の結果を表すためなど、プログラムの多くの場面で不可欠です。

この記事では、float 型の基本的な使い方、指数表記、そして float を扱う上で最も重要な「計算誤差」という注意点について解説します。

目次

float の基本的な使い方

数値に小数点を含めて記述することで、その値は自動的に float 型として扱われます。

# 円周率の近似値
pi_approx = 3.14159

# 平均スコア
average_score = 82.75

# 温度
temperature = -12.5

# type() で型を確認
print(f"'average_score' の型: {type(average_score)}")

実行結果:

'average_score' の型: <class 'float'>

割り算(/)の結果

Pythonでは、int 同士の割り算であっても、/ 演算子を使った場合、その結果は常に float になります

total_items = 15
user_count = 4

# 15 / 4 = 3.75
items_per_user = total_items / user_count

print(f"一人当たりの数: {items_per_user}")
print(f"結果の型: {type(items_per_user)}")

実行結果:

一人当たりの数: 3.75
結果の型: <class 'float'>

指数表記 (E-notation)

非常に大きな数値や、非常に小さな数値を記述する際には、指数表記(科学的表記法)が便利です。これは e または E を使って表現します。

a e b は、「a 掛ける 10 の b 乗」($a \times 10^b$)を意味します。

# 4.5e8 = 4.5 * 10^8 = 450,000,000.0
large_value = 4.5e8
print(f"大きな数値: {large_value}")

# 3.0e-5 = 3.0 * 10^-5 = 0.00003
small_value = 3.0e-5
print(f"小さな数値: {small_value}")

実行結果:

大きな数値: 450000000.0
小さな数値: 3e-05

float を扱う上での最重要注意点:計算誤差

float を使う上で、int と決定的に異なるのが「計算誤差」の問題です。

コンピュータは内部的に数値を2進数で扱います。0.5($1/2$)のように2進数で正確に表現できる小数もありますが、0.11.1 のように、10進数ではキリが良くても2進数では無限小数となり、正確に表現できない値が存在します。

その結果、直感に反する計算結果が生じることがあります。

# 1.1 + 2.2 を計算
val_a = 1.1
val_b = 2.2
sum_val = val_a + val_b

# 期待する値は 3.3
print(f"計算結果: {sum_val}")
print(f"期待値 3.3 と等しいか?: {sum_val == 3.3}")

実行結果:

計算結果: 3.3000000000000003
期待値 3.3 と等しいか?: False

1.1 + 2.2 の結果が 3.3 ではなく 3.3000000000000003 のような非常にわずかにずれた値になってしまいました。これが float の計算誤差です。

誤差への対処法

この誤差は float の仕様(IEEE 754標準)に起因するため避けられませんが、対処法は存在します。

1. round() 関数による丸め処理

計算結果を比較する前に、round() 関数を使って一定の小数点で丸める(四捨五入する)方法です。ただし、これは厳密な比較ではなく、近似的な比較である点に注意が必要です。

# 小数点以下5桁程度で丸めてから比較
if round(sum_val, 5) == 3.3:
    print("round() を使えば、ほぼ 3.3 とみなせます。")

実行結果:

round() を使えば、ほぼ 3.3 とみなせます。

2. decimal モジュール(厳密な計算)

金融計算(お金の計算)や、誤差が許されない科学技術計算では、float の代わりに decimal モジュールを使用することが強く推奨されます。

decimal は、10進数を10進数のまま(2進数に変換せずに)計算するためのモジュールです。

from decimal import Decimal

# 注意: Decimalに変換する際は、floatではなく文字列 "..." で渡すのが確実
dec_a = Decimal("1.1")
dec_b = Decimal("2.2")

dec_sum = dec_a + dec_b

print(f"Decimalでの計算結果: {dec_sum}")
print(f"Decimal("3.3") と等しいか?: {dec_sum == Decimal("3.3")}")

実行結果:

Decimalでの計算結果: 3.3
Decimal("3.3") と等しいか?: True

Decimal を使用することで、3.3 という期待通りの結果が得られました。

まとめ

  • float は小数点を含む数値を扱います。
  • 割り算 / の結果は常に float になります。
  • 4.5e8 のような指数表記が使用できます。
  • float には2進数表現に起因する「計算誤差」が常に伴います。1.1 + 2.23.3 になりません。
  • 厳密な計算(特にお金の計算)が必要な場合は、float ではなく decimal モジュールの使用を検討してください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次