"fractions" --- 有理数
**********************

**ソースコード:** Lib/fractions.py

======================================================================

"fractions" モジュールは有理数の演算をサポートします。

Fraction インスタンスは、2 つの有理数、1 つの数値、または文字列から作
成できます。

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(number)
class fractions.Fraction(string)

   最初の形式では *numerator* と *denominator* が "numbers.Rational"
   のインスタンスである必要があり、"numerator/denominator" と等しい値
   を持つ新しい "Fraction" インスタンスを返します。 *denominator* がゼ
   ロの場合は "ZeroDivisionError" を送出します。

   2 番目の形式では *number* が "numbers.Rational" のインスタンスであ
   るか、"as_integer_ratio()" メソッドを持つ必要があります ("float" と
   "decimal.Decimal" はこれに含まれます)。 まったく同じ値を持つ
   "Fraction" インスタンスを返します。 "as_integer_ratio()" メソッドは
   互いに素な整数のペアを返し、後者が正であることを前提としています。
   二進浮動小数点に伴う一般的な問題 (浮動小数点演算、その問題と制限 を
   参照) により、"Fraction(1.1)" の引数は厳密には 11/10 と等しくないた
   め、"Fraction(1.1)" は期待するかもしれない "Fraction(11, 10)" を返
   すわけでは *ありません*。 (ただし、以下の "limit_denominator()" メ
   ソッドの説明を参照してください。)

   最後の形式のコンストラクタは文字列を受け取ります。 通常は次の形式で
   す。

      [sign] numerator ['/' denominator]

   ここで、オプションの "sign" は '+' か '-' のどちらかであり、
   "numerator" および (存在する場合) "denominator" は十進数の数字の文
   字列です (コード中の整数リテラルと同様、アンダースコアを使って桁を
   区切れます)。さらに、 "float" コンストラクタで受け付けられる有限の
   値を表す文字列は、"Fraction" コンストラクタでも受け付けられます。ど
   ちらの形式でも、入力される文字列は前後に空白があって構いません。以
   下に、いくつかの例を示します:

      >>> from fractions import Fraction
      >>> Fraction(16, -10)
      Fraction(-8, 5)
      >>> Fraction(123)
      Fraction(123, 1)
      >>> Fraction()
      Fraction(0, 1)
      >>> Fraction('3/7')
      Fraction(3, 7)
      >>> Fraction(' -3/7 ')
      Fraction(-3, 7)
      >>> Fraction('1.414213 \t\n')
      Fraction(1414213, 1000000)
      >>> Fraction('-.125')
      Fraction(-1, 8)
      >>> Fraction('7e-6')
      Fraction(7, 1000000)
      >>> Fraction(2.25)
      Fraction(9, 4)
      >>> Fraction(1.1)
      Fraction(2476979795053773, 2251799813685248)
      >>> from decimal import Decimal
      >>> Fraction(Decimal('1.1'))
      Fraction(11, 10)

   "Fraction" クラスは抽象基底クラス "numbers.Rational" を継承し、その
   全てのメソッドと演算を実装します。 "Fraction" インスタンスは *ハッ
   シュ可能* で、不変 (immutable) であるものとして扱われます。加えて、
   "Fraction" には以下のプロパティとメソッドがあります:

   バージョン 3.2 で変更: "Fraction" のコンストラクタが "float" および
   "decimal.Decimal" インスタンスを受け付けるようになりました。

   バージョン 3.9 で変更: *numerator* と *denominator* の正規化に
   "math.gcd()" 関数を使うようになりました。 "math.gcd()" は常に "int"
   型を返します。 以前は最大公約数の型が *numerator* と *denominator*
   に依存していました。

   バージョン 3.11 で変更: 文字列から "Fraction" インスタンスを作成す
   る際に、**PEP 515** の規則に従ってアンダースコアを使えるようになり
   ました。

   バージョン 3.11 で変更: "Fraction" は、"typing.SupportsInt" のイン
   スタンス検査を満たすよう "__int__" を実装しました。

   バージョン 3.12 で変更: 文字列の入力で、"Fraction('2 / 3')" のよう
   にスラッシュの前後に空白を入れられるようになりました。

   バージョン 3.12 で変更: "Fraction" instances now support float-
   style formatting, with presentation types ""e"", ""E"", ""f"",
   ""F"", ""g"", ""G"" and ""%"".

   バージョン 3.13 で変更: 表現型を指定せずに "Fraction" インスタンス
   を書式化する場合に、埋め文字、配置、符号の処理、最小幅、桁のグルー
   プ化をサポートするようになりました。

   バージョン 3.14 で変更: "Fraction" コンストラクタが
   "as_integer_ratio()" メソッドを持つ任意のオブジェクトを受け取れるよ
   うになりました。

   numerator

      有理数を既約分数で表したときの分子。

   denominator

      有理数を既約分数で表したときの分母です。 正であることが保証され
      ています。

   as_integer_ratio()

      元の Fraction と等しい比を表す、2 つの整数のタプルを返します。
      この比は既約で、分母は正です。

      Added in version 3.8.

   is_integer()

      Fraction が整数なら "True" を返します。

      Added in version 3.12.

   classmethod from_float(f)

      "float" または "numbers.Integral" のインスタンスだけを受け取る代
      替コンストラクタです。 "Fraction.from_float(0.3)" は
      "Fraction(3, 10)" と同じ値ではないことに注意してください。

      注釈:

        Python 3.2 以降では、 "float" から直接 "Fraction" インスタンス
        を構築できるようになりました。

   classmethod from_decimal(dec)

      "decimal.Decimal" または "numbers.Integral" のインスタンスだけを
      受け取る代替コンストラクタです。

      注釈:

        Python 3.2 以降では、 "decimal.Decimal" インスタンスから直接
        "Fraction" インスタンスを構築できるようになりました。

   classmethod from_number(number)

      "numbers.Integral"、"numbers.Rational"、"float"、
      "decimal.Decimal" のインスタンス、および "as_integer_ratio()" メ
      ソッドを持つオブジェクトだけを受け取る代替コンストラクタです。
      文字列は受け取りません。

      Added in version 3.14.

   limit_denominator(max_denominator=1000000)

      分母が高々 max_denominator である、 "self" に最も近い "Fraction"
      を見付けて返します。このメソッドは与えられた浮動小数点数の有理数
      近似を見つけるのに役立ちます:

      >>> from fractions import Fraction
      >>> Fraction('3.1415926535897932').limit_denominator(1000)
      Fraction(355, 113)

      あるいは float で表された有理数を元に戻すのにも使えます:

      >>> from math import pi, cos
      >>> Fraction(cos(pi/3))
      Fraction(4503599627370497, 9007199254740992)
      >>> Fraction(cos(pi/3)).limit_denominator()
      Fraction(1, 2)
      >>> Fraction(1.1).limit_denominator()
      Fraction(11, 10)

   __floor__()

      最大の "int" "<= self" を返します。このメソッドは "math.floor()"
      関数からでもアクセスできます:

      >>> from math import floor
      >>> floor(Fraction(355, 113))
      3

   __ceil__()

      最小の "int" ">= self" を返します。このメソッドは "math.ceil()"
      関数からでもアクセスできます。

   __round__()
   __round__(ndigits)

      第一のバージョンは、 "self" に最も近い "int" を偶数丸めで返しま
      す。第二のバージョンは、このメソッドは "self" に最も近い
      "Fraction(1, 10**ndigits)" の倍数 (論理的に、 "ndigits" が負なら
      ) を、これも偶数丸めで丸めます。 "round()" 関数からでもアクセス
      できます。

   __format__(format_spec, /)

      "str.format()" メソッド、組み込み関数 "format()"、フォーマット済
      み文字列リテラル による "Fraction" インスタンスの書式化をサポー
      トします。

      書式指定文字列 "format_spec" が表現型 "'e'"、"'E'"、"'f'"、"'F'"
      、"'g'"、"'G'"、"'%'" のいずれでも終わらない場合は、書式指定ミニ
      言語 で説明する埋め文字、配置、符号の処理、最小幅、桁のグループ
      化の一般的な規則に従って書式化します。 「別形式」のフラグ "'#'"
      をサポートします。 これを指定すると、書式化する値が厳密に整数で
      あっても、出力文字列に常に分母を明示します。 ゼロ埋めのフラグ
      "'0'" はサポートしません。

      書式指定文字列 "format_spec" が表現型 "'e'"、"'E'"、"'f'"、"'F'"
      、"'g'"、"'G'"、"'%'" のいずれかで終わる場合は、書式指定ミニ言語
      節に記載された "float" 型の規則に従って書式化します。

      ここに例があります:

         >>> from fractions import Fraction
         >>> format(Fraction(103993, 33102), '_')
         '103_993/33_102'
         >>> format(Fraction(1, 7), '.^+10')
         '...+1/7...'
         >>> format(Fraction(3, 1), '')
         '3'
         >>> format(Fraction(3, 1), '#')
         '3/1'
         >>> format(Fraction(1, 7), '.40g')
         '0.1428571428571428571428571428571428571429'
         >>> format(Fraction('1234567.855'), '_.2f')
         '1_234_567.86'
         >>> f"{Fraction(355, 113):*>20.6e}"
         '********3.141593e+00'
         >>> old_price, new_price = 499, 672
         >>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1)
         '34.67% price increase'

参考:

  "numbers" モジュール
     数値の塔を作り上げる抽象基底クラス。
