Pythonで数値データを扱っていると、「小数点第三位以下は不要なので、切り捨てて第二位までで表示したい」「請求金額を計算する上で、小数点以下を正確に切り捨てたい」といった場面は非常に多くあります。
しかし、Pythonの標準関数round()
は「四捨五入」を行うため、単純な「切り捨て」の要件には合いません。
また、コンピュータにおける小数(浮動小数点数)の扱いは、時に意図しない誤差を生む可能性もはらんでいます。
この記事では、Pythonで小数点を指定した桁数で確実に「切り捨てる」ための方法を、4つのアプローチから徹底解説します。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
プログラミングスクール
■Webエンジニアの育成に特化 ■自社開発企業への転職成功率がダントツ ■ハイスキルを求める人に最適 |
|
■サポートは半永久的 ■単価80万円以上の講師陣 ■AWSやJavaに強い |
|
■受講料完全無料 ■最短1か月で卒業 ■教室への通学も可能 |
Pythonで小数点第二位を切り捨てる方法4選
それでは、早速具体的な方法を見ていきましょう。
それぞれの特徴と使い所を理解することが重要です。
math.floor()を使った計算による切り捨て
標準ライブラリのmath
モジュールに含まれるfloor()
関数を使った、数学的なアプローチです。
floor
は「床」を意味し、指定した数値以下の最大の整数を返す関数です。
任意の桁で切り捨てるには、少し工夫が必要になります。
小数点第二位で切り捨てる場合の考え方は以下の通りです。
- 元の数値を100倍する (例: 3.14159 → 314.159)
math.floor()
で小数点以下を切り捨てる (例: 314.159 → 314)- 結果を100で割って元に戻す (例: 314 → 3.14)
サンプルコード
import math
# 元の数値
value = 3.14159265
# 1. 100倍する
value_multiplied = value * 100
# 2. math.floor()で小数点以下を切り捨てる
value_floored = math.floor(value_multiplied)
# 3. 100で割る
result = value_floored / 100
print(f"元の数値: {value}")
print(f"切り捨て後の数値: {result}")
# これを一行で書くこともできます
result_oneline = math.floor(value * 100) / 100
print(f"一行で処理した場合: {result_oneline}")
実行結果
元の数値: 3.14159265
切り捨て後の数値: 3.14
一行で処理した場合: 3.14
ソースコードの解説
この方法は、計算のプロセスが直感的で分かりやすいのが特徴です。
import math
でmath
モジュールを読み込み、math.floor()
関数を利用しています。
小数点第三位で切り捨てたい場合は1000倍して1000で割る、というように応用も簡単です。
一般的なケースではこの方法で十分ですが、後述するコンピュータの「浮動小数点数誤差」の影響を受ける可能性がゼロではない点には注意が必要です。
文字列フォーマットを利用した切り捨て
文字列フォーマットを利用した切り捨ては、計算結果を最終的に文字列として表示したい場合に便利な方法です。
ただし、書式を指定するだけでは「四捨五入」になるため、一工夫必要になります。
f-stringを使う方法
モダンなPython(3.6以降)で推奨される、シンプルで読みやすい文字列フォーマットです。
【サンプルコード】
import math
value = 3.149
# NG例:単純な書式指定では四捨五入される
rounded_str = f"{value:.2f}"
print(f"四捨五入された結果: {rounded_str}")
# OK例:計算と組み合わせて切り捨てを実現
truncated_value = math.floor(value * 100) / 100
truncated_str = f"{truncated_value:.2f}"
print(f"切り捨てられた結果: {truncated_str}")
【実行結果】
四捨五入された結果: 3.15
切り捨てられた結果: 3.14
f"{value:.2f}"
という書式は、「小数点第二位まで表示する浮動小数点数」という意味ですが、この処理は四捨五入(正確には銀行家の丸め)を行います。
3.149
が3.15
になっていることからそれが分かります。
そのため、文字列として切り捨てたい場合も、一度math.floor()
を使った計算で切り捨て処理を行った後、その結果をf-stringでフォーマットするのが確実な方法です。
format()メソッドや%演算子を使う方法
古いバージョンのPythonでも使われてきた方法です。
考え方はf-stringと全く同じで、書式指定だけでは四捨五入になる点に注意が必要です。
import math
value = 3.149
# format()メソッドの場合
truncated_value = math.floor(value * 100) / 100
print("format()の結果: {:.2f}".format(truncated_value))
# %演算子の場合
print("%%演算子の結果: %.2f" % truncated_value)
実行結果はf-stringのOK例と同じ3.14
になります。
Decimalモジュールを使った厳密な切り捨て
請求金額の計算や科学技術計算など、1円の誤差も許されない厳密な計算が求められる場面では、このDecimal
モジュール一択です。
コンピュータは通常、小数を二進数で扱いますが、0.1
のような単純な小数でも二進数では正確に表現できず、ごく僅かな誤差(浮動小数点数誤差)が生じます。
# float型の誤差の例
print(0.1 + 0.1 + 0.1) # 実行結果: 0.30000000000000004
```Decimal`モジュールは、このような誤差を生じさせない十進数計算を提供します。
#### サンプルコード
```python
from decimal import Decimal, ROUND_FLOOR
# 注意:Decimalオブジェクトは文字列から生成するのが安全
value = Decimal("3.14159265")
# quantize()メソッドで桁数を指定して丸める
# 第一引数: 桁数の指定 ('0.01'で小数点第二位)
# 第二引数: 丸め方の指定 (ROUND_FLOORで切り捨て)
result = value.quantize(Decimal("0.01"), rounding=ROUND_FLOOR)
print(f"元の数値: {value}")
print(f"切り捨て後の数値: {result}")
print(f"結果の型: {type(result)}")
実行結果
元の数値: 3.14159265
切り捨て後の数値: 3.14
結果の型: <class 'decimal.Decimal'>
ソースコードの解説
from decimal import Decimal, ROUND_FLOOR
で必要なクラスと定数をインポートします。
Decimal("3.14159265")
重要なのは、Decimal
オブジェクトを浮動小数点数の3.14159
からではなく、文字列の"3.14159265"
から生成する点です。浮動小数点数から生成すると、その時点で誤差を含んだDecimal
オブジェクトが作られてしまうためです。value.quantize(Decimal("0.01"), rounding=ROUND_FLOOR)
quantize()
メソッドが桁数丸めの核心部分です。- 第⼀引数には、どの桁に丸めるかを
Decimal
オブジェクトで指定します。Decimal("0.01")
は小数点第二位を意味します。 rounding
引数には丸め方を指定します。ROUND_FLOOR
が「切り捨て」を意味する定数です。他にも四捨五入のROUND_HALF_UP
や切り上げのROUND_CEILING
などがあります。
- 第⼀引数には、どの桁に丸めるかを
この方法はコードが少し長くなりますが、誤差のない極めて正確な計算を実現できます。
math.trunc() を使った整数部分の取得
trunc
は「truncate(切り詰める)」の略で、数値の小数部分を単純に切り捨て、整数部分だけを返す関数です。
サンプルコード
import math
value1 = 3.14
value2 = -3.14
print(f"{value1} の整数部分は: {math.trunc(value1)}")
print(f"{value2} の整数部分は: {math.trunc(value2)}")
実行結果
3.14 の整数部分は: 3
-3.14 の整数部分は: -3
ソースコードの解説
math.trunc()
は、正の数でも負の数でも、単純に小数点以下を0にするイメージです。
これはmath.floor()
とは負の数の扱いで異なります。
math.floor(-3.14)
は-3.14
以下の最大の整数である-4
を返します。
この方法は「小数点第一位で切り捨て」のような任意の桁数指定はできませんが、整数部分だけを素早く取得したい場合に便利です。
結局どの方法が小数点第二位の切り捨てに最適か
ここまで4つの方法を紹介しましたが、「結局どれを使えばいいの?」と迷うかもしれません。
結論は、ケースバイケースとなります。
以下に、目的別の最適な選択肢をまとめました。
【ケース1】 一般的なデータ分析や、画面に結果を表示するだけで、厳密な金融計算が不要な場合 |
math.floor() を使った計算が最適です。 コードが直感的で分かりやすく、Pythonの標準機能だけで完結するため、最も手軽でバランスの取れた選択肢といえるでしょう。 |
【ケース2】 請求書や経理システムなど、1円の誤差も許されない金融・会計処理の場合 |
Decimal モジュールを使うことが必須です。 浮動小数点数誤差を完全に排除し、意図した通りの正確な計算結果を保証してくれます。コードは少し複雑になりますが、お金を扱うシステムでは信頼性が最優先されます。 |
【ケース3】 計算結果を特定のフォーマットの文字列として得たい場合 |
文字列フォーマットを利用します。 ただし、この方法はあくまで「表示」のための整形です。切り捨て処理自体はmath.floor() やDecimal で行い、その結果を文字列フォーマットにかける、という使い方になります。 |
【ケース4】 単純に整数部分だけが必要な場合 |
math.trunc() が最もシンプルで高速です。 |
このように、状況に応じてベストな方法を選択してください。
まとめ
この記事では、Pythonで小数点を指定した桁数で切り捨てるための4つの方法を、具体的なコードとともに解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。