Python講座 / 整数・浮動小数点数・数値変換を理解する

intは整数、floatは二進浮動小数点数を表します。十進数として厳密な規則が必要な金額では、整数の最小単位やDecimalを使い、単位と丸め方を明示することが大切です。

算術演算の意味を読み分ける

式 処理 結果
7 / 2 除算 3.5
7 // 2 負の無限大方向への切り捨て除算 3
7 % 2 剰余 1
2 ** 3 累乗 8

//はゼロに近づける処理ではありません。-7 // 2は-4で、int(-3.5)の-3とは異なります。優先順位が読みにくい式では、意図が分かるようにかっこを使います。Pythonの整数は固定の32ビット範囲に制限されませんが、メモリーが無限になるわけではありません。

金額の型選択と分析は、pandasで表データを検証・集計するで扱う規則とつながります。

全体例で数値型を比較する

numeric_demo.pyへ次のコードを保存し、仮想環境でpython numeric_demo.pyを実行します。macOS・Ubuntuで仮想環境外なら、使用中のコマンド名に合わせてpython3を使います。

from decimal import Decimal

print(7 / 2, 7 // 2, 7 % 2)
print(-7 // 2, int(-3.5))
print(0.1 + 0.2 == 0.3)
print(Decimal("0.1") + Decimal("0.2"))
price_won = 3500
print(price_won * 3)

予想される結果です。Falseになった行にも注目してください。

3.5 3 1
-4 -3
False
0.3
10500

変換方法と精度の規則を決める

int("3500")は整数の文字列を解釈します。int("3.5")は失敗しますが、int(3.5)はfloatの小数部分を落とします。float("3.5")は浮動小数点数を作ります。表示の小数桁を減らしても、保存される値の表現が厳密になるわけではありません。

floatの0.1などは二進数で有限桁に収まらないため、0.1 + 0.2と0.3の比較はFalseになります。DecimalにはDecimal("0.1")のように十進文字列を渡し、すでにfloatになった値の誤差を持ち込まないようにします。Decimalでも精度や丸め方法は計算の要件に合わせて決めます。

金額と入力値の境界を確認する

整数のウォン単位の支出なら3500のような整数で保存できます。別の通貨や小数の単位を使う場合には、単位と丸め方を別途定めます。数値型だけで業務上の正しい処理が決まるわけではありません。

-7 // 2と-7 / 2を比較し、除数をゼロへ変えてZeroDivisionErrorを確認したら2へ戻します。int("3500 KRW")も試し、文字列のどこまでを受け付けるのか考えてください。入力の型変換と同様に、意味のある文字を勝手に取り除く前に、受け付ける形式を決める必要があります。

小数点以下2桁に整形してもfloatの保存値は変わりません。format(0.1 + 0.2, ".2f") は文字列 "0.30" になりますが、厳密な十進演算に変わったわけではありません。整数単位で扱える金額は整数にし、十進の桁を厳密に管理する要件では文字列から作るDecimalと丸め規則を選びます。

関連する公式リファレンス