Pythonの数値処理:intの応用と高精度計算

python logo notext.svg

Pythonでは整数を扱うint型が基本ですが、その機能は単なる数値の扱いにとどまりません。
intは文字列からの変換や進数変換など、実務でも役立つ応用的な使い方が可能です。
さらに数値処理では、浮動小数点の誤差といった問題にも注意が必要です。
そのため、高精度な計算を実現するための方法として別の仕組みも理解することが重要になります。

Pythonの導入についてはこちら。

Python入門:最初のプログラムを作って実行する方法 – Lean Data Office

Python環境構築のやり方|初心者向け完全ガイド – Lean Data Office

Pythonの型についての解説はこちら。

Python入門:変数と型(データ型)を理解する – Lean Data Office

intクラスでできる基数変換

まず最初に Python の int クラスでできるちょっと便利なことをいくつか紹介したいと思います。

まず、文字列として数値を渡すと、それを整数に変換してくれます。これは文字列の “100” を整数の 100 にキャストしているわけです。

int('100')
image

そしてこのクラスの面白いところは、第2引数をオプションで指定できる点です。この第2引数に数値を渡すと、「その数値が何進数の値なのか」を指定できます。

int('100', 2)
image

例えば、2進数の “100” は10進数では 4 になります。

ただし、このとき第1引数は必ず文字列である必要があります。もしこんなふうに:

int(100, 2)
image

と書くとエラーになります。

なぜかというと、ある基数から10進数に変換する場合、その文字列には「数字以外の文字」が含まれる可能性があるからです。

例えば, 1abは16進数では正しい表現で、これは 427 を意味します。しかし当然ながら、1ab はそのままでは整数ではありません。

image

そのため、異なる基数から変換するときには、第1引数は文字列である必要があるのです。

このように int クラスはとても便利です。

Decimalクラス

次に、まったく別の数値クラスを見ていきます。これは以下の記事で説明した見た浮動小数点数(float)の問題を解決するものです。

Pythonの整数と浮動小数点数(int・float)の基礎と注意点 – Lean Data Office

float は便利ではあるものの、「浮動小数点誤差」という問題があります。

1.2 - 1.0
image

この結果は 0.2 にはなりません。

アプリケーションによっては、この誤差は無視できますが、場合によっては大きな問題になります。特にお金を扱う場合などです。

こういうときに Python では decimal モジュールを使います。

decimal を使うには、最初にインポートが必要です:

from decimal import Decimal, getcontext
image

通常、インポートはコードの先頭に書くのが一般的です。

Python には便利なコードのまとまり(モジュール)が用意されていて、printfloat のようにそのまま使えるものもありますが、decimal のように明示的に import が必要なものもあります。

グローバル設定の変更

getcontext() を呼び出すと、いくつかの設定を持つオブジェクトが返ります。これは decimal クラスの動作に関するグローバル設定です。

image

例えば、精度を変えるには:

getcontext().prec=4

とします。

再び getcontext() を見ると、精度が4に変わっているのが確認できます。

image

Decimalクラスの使い方

Decimal クラスはこんなふうに使えます:

Decimal(1) / Decimal(3)
image

これは、Decimal型で 1 ÷ 3 を計算していることを示しています。

精度を2に変えると:

getcontext().prec=2

結果は小数点以下2桁になります。

image

もし float を Decimal に渡すと:

Decimal(3.14)
image

長い数字が表れますがこれはバグではなく、「float が実際に持っている値を正確に再現している」ためです。

つまり、これが浮動小数点誤差の本質です。

これを避けるには、文字列で渡します:

Decimal(3.14)

こうするときれいな値になります。

image

Decimal クラスにはいろいろな使い方があるので、興味があれば公式ドキュメントを見ることをおすすめします。

では、常に float の代わりに Decimal を使うべき、というわけでもありません

  • 表示前に適切に丸めることが大事
  • 非常に小さい or 大きい数を扱う場合は注意

ただし、ほとんどのケースでは float で問題ありません。

1.2 - 1.0

この結果をそのまま返すのではなく、丸めてからユーザーに見せればOKです。

image

intは単なる整数型ではなく、文字列変換や基数指定など多様な使い道を持っています。
特に進数変換の機能は、データ処理やエンジニアリングの現場で役立つ重要なポイントです。
一方で浮動小数点には誤差があるため、用途によってはより正確な計算方法が求められます。
用途に応じてfloatと高精度計算(例:decimal)を使い分けることが、適切な数値処理の鍵になります。

筋トレとオートメーションが趣味。 モバイルアプリ個人開発者。 データ処理・可視化とレポートにハマり備忘録と情報共有のためにブログ開設し運営している。