Python fractionsの使い方

この記事のポイント

Pythonのfractionsは、小数の計算で起こりがちな誤差を防ぎ、正確な分数を扱うための標準ライブラリです。

この記事を読むと、次のようなことが身に付きます。

  • 分数を正確に計算する基本的な使い方がわかる
  • 小数や文字列から分数を正しく作る方法がわかる
  • 分数同士の足し算や割り算、大小の比べ方がわかる

この記事を通してfractionsの正しい使い方を学べば、お金の計算や科学技術計算など、ズレが許されない正確な処理ができるようになります。

目次

fractionsとは?

fractionsとは、算数で習う分数をPythonで正確に表現し計算するための標準ライブラリです。

コンピュータは普段、小数を扱うのが少し苦手で、0.1 + 0.2のような計算でも、ごくわずかな誤差が生じて0.3ぴったりにならない場合があります。

fractionsを使うと、数を分子と分母を持った分数の形で扱うため、計算の誤差を防ぎ、数学的に正しい結果を得ることができます。

fractionsの特徴

  • 数を分子と分母の整数のペアとして管理する
  • 計算結果は自動的に約分された分数の形で得られる
  • 小数の計算で発生しがちな誤差をなくすことができる
  • 会計システムや科学計算など、高い精度が求められる分野で役立つ

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

fractionsを使うには、fractionsモジュールからFractionをインポートします。Fraction()の引数に「分子」と「分母」を順番に指定すると、分数(Fractionオブジェクト)を作ることができます。

from fractions import Fraction # 整数から分数を作成 f1 = Fraction(3, 4) # 3/4 print(f1)

出力結果

3/4

この例では、Fraction(3, 4)と指定しているため、「3/4」という分数(Fractionオブジェクト)が作られ、出力されています。

整数だけでなく、文字列や小数(浮動小数点数)からも分数を作ることができます。文字列の場合は'分子/分母'のように指定し、小数の場合は自動的に分数へ変換されます。

from fractions import Fraction # 文字列から分数を作成 f2 = Fraction('1/3') # 小数から分数を作成 f3 = Fraction(0.25) print(f2, f3)

出力結果

1/3 1/4

この例では、Fraction('1/3')で文字列から、Fraction(0.25)で小数から分数を作っています。0.25は数学的に「1/4」と等しいため、自動的に変換されて「1/4」という結果が出力されています。

実用例

fractionsをどのような場面で使えるのか、コード例とあわせて紹介します。分数計算の特徴や便利さが分かるように、出力結果とあわせて解説します。

これらのサンプルコードを通じて、fractionsモジュールの便利さと正確性を実感していただけるでしょう。

基本的な分数生成と表示

分数(Fractionオブジェクト)の作り方と、どのように表示されるかを見ていきましょう。分母と分子を指定する基本的な方法と、自動で約分される仕組みを確認します。

from fractions import Fraction # さまざまな方法で分数を作成 cat_fraction = Fraction(6, 9) # ネコの分数 dog_fraction = Fraction(4, 6) # イヌの分数 print(f"ネコ: {cat_fraction}") print(f"イヌ: {dog_fraction}")

出力結果

ネコ: 2/3
イヌ: 2/3

この例では、Fraction(6, 9)(6/9)とFraction(4, 6)(4/6)の2つの分数を作っています。fractionsは自動的に約分を行うため、どちらも数学的に等しい「2/3」として表示されています。

分数の四則演算

分数同士の加算、減算、乗算、除算の基本的な計算方法を紹介します。+や*といった、算術演算子を使って直感的に計算できるのが特徴です。

from fractions import Fraction # 動物の分数で四則演算 rabbit = Fraction(1, 3) bear = Fraction(2, 5) print(f"ウサギ + クマ: {rabbit + bear}") print(f"ウサギ × クマ: {rabbit * bear}") print(f"ウサギ ÷ クマ: {rabbit / bear}")

出力結果

ウサギ + クマ: 11/15
ウサギ × クマ: 2/15
ウサギ ÷ クマ: 5/6

この例では、1/3(rabbit)と2/5(bear)の四則演算を行っています。計算の過程で必要な通分や、結果の約分はfractionsが自動で行うため、1/3 + 2/5 = 11/15のように、数学的に正しい計算結果が簡単な形で得られます。

小数から分数への変換

浮動小数点数を、正確な分数の形に変換する方法を解説します。fractionsを使うと、小数を扱う際に起こりがちな計算の誤差を避け、正確な計算ができます。

from fractions import Fraction # 小数を分数に変換 tiger_decimal = 0.125 lion_decimal = 0.375 tiger_fraction = Fraction(tiger_decimal).limit_denominator() lion_fraction = Fraction(lion_decimal).limit_denominator() print(f"トラ: {tiger_decimal} → {tiger_fraction}") print(f"ライオン: {lion_decimal} → {lion_fraction}")

出力結果

トラ: 0.125 → 1/8
ライオン: 0.375 → 3/8

この例では、小数0.125と0.375をFraction()で分数に変換しています。limit_denominator()メソッドを使うと、その小数に近い分母が小さい分数に変換できます。0.125は「1/8」、0.375は「3/8」に正しく変換され、小数のまま計算する際の誤差を避けられます。

文字列からの分数生成

"3/7"のような文字列の形で表された分数を、Fractionオブジェクトに変換する方法を紹介します。ファイルからデータを読み込んだり、ユーザーに入力してもらったりする場面で役立ちます。

from fractions import Fraction # 文字列から分数を生成 elephant_str = "3/7" giraffe_str = "5/8" elephant = Fraction(elephant_str) giraffe = Fraction(giraffe_str) print(f"ゾウ: {elephant}") print(f"キリン: {giraffe}") print(f"合計: {elephant + giraffe}")

出力結果

ゾウ: 3/7
キリン: 5/8
合計: 59/56

この例では、"3/7"と"5/8"という文字列から直接Fractionオブジェクトを生成しています。生成されたelephantとgiraffeは、そのまま加算などの計算に使うことができ、「59/56」という計算結果が得られています。

分数の比較と大小関係

分数同士の大小比較や等しいかどうかを判定する方法を説明します。<(より小さい)や>(より大きい)といった、比較演算子をそのまま使って、正確に比べることができます。

from fractions import Fraction # 分数の比較 monkey_fraction = Fraction(2, 3) panda_fraction = Fraction(3, 4) print(f"サル: {monkey_fraction}") print(f"パンダ: {panda_fraction}") print(f"サル < パンダ: {monkey_fraction < panda_fraction}") print(f"大きいのは: {'パンダ' if panda_fraction > monkey_fraction else 'サル'}")

出力結果

サル: 2/3
パンダ: 3/4
サル < パンダ: True
大きいのは: パンダ

この例では、2/3(monkey_fraction)と3/4(panda_fraction)の大小を比較しています。fractionsは内部で自動的に通分(2/3は8/12、3/4は9/12)を行って比べるため、monkey_fraction < panda_fraction(サル < パンダ)がTrue(正しい)と正確に判定されています。

分数の約分と通分

分数の基本的な操作である約分と通分について、fractionsモジュールでの処理方法を解説します。数学的に正しい操作が自動でおこなわれます。

from fractions import Fraction # 約分の確認 horse_original = Fraction(12, 18) cow_original = Fraction(15, 25) print(f"ウマ(元): 12/18 → {horse_original}") print(f"ウシ(元): 15/25 → {cow_original}") print(f"分母: {horse_original.denominator}, 分子: {horse_original.numerator}")

出力結果

ウマ(元): 12/18 → 2/3
ウシ(元): 15/25 → 3/5
分母: 3, 分子: 2

この例では、12/18(horse_original)と15/25(cow_original)が、Fractionオブジェクトになった時点ですぐに約分され、それぞれ「2/3」と「3/5」になっています。denominator(分母)とnumerator(分子)というプロパティを使って、約分後の分母(3)や分子(2)の値を個別に取得できます。

最大公約数を使った計算

fractionsモジュールと組み合わせて、最大公約数を活用した計算をおこなう方法を紹介します。数学的な処理をより深く理解できます。

from fractions import Fraction import math # 最大公約数を使った処理 sheep_numerator = 8 sheep_denominator = 12 sheep_fraction = Fraction(sheep_numerator, sheep_denominator) goat_fraction = Fraction(6, 9) gcd_result = math.gcd(sheep_numerator, sheep_denominator) print(f"ヒツジ: {sheep_fraction}") print(f"ヤギ: {goat_fraction}") print(f"ヒツジの分子と分母の最大公約数: {gcd_result}")

出力結果

ヒツジ: 2/3
ヤギ: 2/3
ヒツジの分子と分母の最大公約数: 4

この例では、mathモジュールのgcd関数を組み合わせて、より数学的な処理を行っています。fractionsは自動で約分を行いますが、math.gcd()のような他の関数と組み合わせることで、分子や分母の性質を調べるといった応用も可能です。

まとめ

Pythonのfractionsは、小数の計算で起こりがちな誤差を防ぎ、数学的に正確な分数を扱うための標準ライブラリです。この記事では、基本的な使い方から、四則演算や比較の方法まで解説しました。

fractionsが活躍する場面は次のようなケースです。

fractionsが活躍する場面

  • 会計システムなど、お金の計算で誤差を許さないとき
  • 科学計算や工学計算で、正確な数値が必要なとき
  • 数学の学習用プログラムで、分数をそのまま扱いたいとき

fractionsを用いる上で、押さえておきたいポイントを覚えておきましょう。

重要なポイント

  • Fraction(分子,分母)で分数オブジェクトを作る
  • 作成された分数は、自動的に約分される
  • +や<などの演算子でそのまま計算や比較ができる
  • 小数や文字列からも分数を作ることができる

初めてPythonを学ぶ方も、この記事で紹介したfractionsを実際に書いて、基本的な使い方を試してみてください。

小数の誤差は、プログラムが複雑になると思わぬ不具合の原因になることがあります。

ぜひfractionsを使いこなし、正確で信頼性の高いプログラムを作成できるようになりましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python fractionsの使い方