HOWTO · Python

Python で浮動小数点数を整数に変換する

この記事では、Python で浮動小数点数を整数に変換する方法を紹介します

このページの内容

Pythonで浮動小数点数を整数に変換し、小数部分を0に近づく方向に切り捨てるには、組み込みの int() を使います。別の規則で変換する場合は、math.ceil() で値以上の最小の整数に切り上げるか、math.floor() で値以下の最大の整数に切り下げます。標準ライブラリには、0に近づく方向に切り捨てる math.trunc() もあります。計算に必要な丸め方に合わせて関数を選びましょう。負の値では、これらの関数の結果が同じにならないことがあります。

浮動小数点数を int() で整数に変換する

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

number = 25.49
print(int(number))
25

正の小数値を int() に渡すと、小数部分が取り除かれます。負の値でも0に近づく方向に同じ処理を行います。たとえば int(-1.5) は -2 ではなく -1 です。これは切り捨てであり、最も近い整数への丸めではありません。最も近い値に丸める必要がある場合は、int() がそうすると考えずに、丸め用の処理を使ってください。

int() は浮動小数点数、整数、そして int("25") のような整数を表す文字列を受け取れます。"25.49" のように小数点を含む文字列は整数形式ではないため、そのまま int() に渡すことはできません。小数部分を切り捨てる意図がある場合は、まず小数を含む文字列を浮動小数点数に変換し、その値を整数に変換します。数値の浮動小数点数を渡す場合と文字列を渡す場合では変換が異なるため、入力の型に注意してください。

浮動小数点数リテラルは、記述した10進数とは異なる値として表現されることがあります。たとえば、Pythonでは 1.9999999999999999 が 2.0 として表現される場合があります。そのように表現された浮動小数点数に int() を適用すると、2.0 が表す整数になります。9が16桁以上続く場合に int() で特別な処理が行われるわけではありません。変換対象は解析後に存在する浮動小数点数なので、整数に近い値での結果には、切り捨てだけでなく浮動小数点数の表現も影響することがあります。

math で切り捨て・切り上げ・切り下げを選ぶ

意図する規則を明示したい場合は math モジュールを使います。math.trunc() は0に近づく方向に切り捨て、浮動小数点数に対しては int() と同じ結果になります。math.ceil() は値以上の最小の整数を返し、math.floor() は値以下の最大の整数を返します。違いは負の値で重要になります。-1.5 を0に近づく方向に切り捨てると -1 ですが、切り下げると -2、切り上げると -1 です。正の小数では、切り捨てと切り下げはいずれも同じ小さい整数になり、切り上げでは大きい整数になります。

次の自己完結した例では、正負両方の値に対する標準ライブラリの3つの関数を比較します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import math

for number in (1.5, -1.5):
    print(number, math.trunc(number), math.ceil(number), math.floor(number))
1.5 1 2 1
-1.5 -1 -1 -2

小数部分を0に近づく方向に取り除く場合は int() または math.trunc() を使います。結果を入力値より小さくしてはいけない場合は math.ceil()、入力値より大きくしてはいけない場合は math.floor() を選びます。たとえば、測定量を整数単位に変換するときは、完全な単位だけを残すのか、常に必要量を満たすように単位数を確保するのか、量に完全に含まれる単位だけを数えるのかを決めます。コードで規則を明示すると、結果を確認しやすくなり、意図しない丸め方向に頼らずに済みます。

通常の有限な数値を入力した場合、これらの関数はいずれもPythonの整数を返します。小数部分の情報は保持されません。後続の計算でその精度が必要なら、変換後の整数とともに元の浮動小数点数も保持してください。正確な10進演算が必要な量では、変換前に10進数表現のほうが適切か検討しましょう。すでに近似された浮動小数点数を変換しても、表現時に失われた10進桁は復元できません。