1. ホーム
  2. python

[解決済み] 小数を分数に変換するには?

2023-02-14 19:23:44

質問

Pythonで小数を最小の分数に変換する方法を教えてください。

例えば

0.25  -> 1/4
0.5   -> 1/2
1.25  -> 5/4
3     -> 3/1

どのように解決するのですか?

2つのオプションがあります。

  1. 使用する float.as_integer_ratio() :

    >>> (0.25).as_integer_ratio()
    (1, 4)
    
    

    (Python3.6以降では で同じことができます。 decimal.Decimal() オブジェクト .)

  2. を使用します。 fractions.Fraction() タイプ :

    >>> from fractions import Fraction
    >>> Fraction(0.25)
    Fraction(1, 4)
    
    

後者には、非常に便利な str() の変換があります。

>>> str(Fraction(0.25))
'1/4'
>>> print Fraction(0.25)
1/4

浮動小数点値は不正確な場合があるので、「奇妙な」分数になることがあります。分母を制限して分数をいくらか「単純化」するには Fraction.limit_denominator() :

>>> Fraction(0.185)
Fraction(3332663724254167, 18014398509481984)
>>> Fraction(0.185).limit_denominator()
Fraction(37, 200)

Python 2.6をまだ使っているのであれば Fraction() を渡すことはまだサポートされていません。 float を直接渡すことはできませんが ができます。 に上記の2つのテクニックを組み合わせます。

Fraction(*0.25.as_integer_ratio())

あるいは Fraction.from_float() クラスメソッド :

Fraction.from_float(0.25)

は、本質的に同じことをします。例えば、整数の比率のタプルを取り、それを2つの別々の引数として渡します。

そして、あなたのサンプル値を使った小さなデモです。

>>> for f in (0.25, 0.5, 1.25, 3.0):
...     print f.as_integer_ratio()
...     print repr(Fraction(f)), Fraction(f)
... 
(1, 4)
Fraction(1, 4) 1/4
(1, 2)
Fraction(1, 2) 1/2
(5, 4)
Fraction(5, 4) 5/4
(3, 1)
Fraction(3, 1) 3

という両方の fractions モジュールと float.as_integer_ratio() メソッドは Python 2.6 で新しく追加されました。