0

私はこの関数を別の関数内に持っています:

def _sum(k):
        return sum([(-1) ** v * fractions.Fraction(str(bin_coeff(k, v))) * fractions.Fraction((n + v) ** m, k + 1) for v in xrange(k + 1)])

私がbin_coeffでfractions.Fractionを呼び出すと、次のエラーが報告されます:

ValueError: Invalid literal for Fraction: '1.05204948186e+12'

その形式の float を Fraction オブジェクトに変換するにはどうすればよいですか?

以下よりも優れた解決策はありますか?

fractions.Fraction(*bin_coeff(k, v).as_integer_ratio())

ありがとう、
ルービック

PS bin_coeff は常に float を返します

4

2 に答える 2

1

興味がある場合、これは(ご想像のとおり)次のFraction正規表現によるものです。fractions.py

_RATIONAL_FORMAT = re.compile(r"""
    \A\s*                      # optional whitespace at the start, then
    (?P<sign>[-+]?)            # an optional sign, then
    (?=\d|\.\d)                # lookahead for digit or .digit
    (?P<num>\d*)               # numerator (possibly empty)
    (?:                        # followed by an optional
       /(?P<denom>\d+)         # / and denominator
    |                          # or
       \.(?P<decimal>\d*)      # decimal point and fractional part
    )?
    \s*\Z                      # and optional whitespace to finish
""", re.VERBOSE)

これは、科学的記数法のフロートとは一致しません。これはPython2.7で変更されました(2.7がインストールされていないため、以下は3.1からのものです)。

_RATIONAL_FORMAT = re.compile(r"""
    \A\s*                      # optional whitespace at the start, then
    (?P<sign>[-+]?)            # an optional sign, then
    (?=\d|\.\d)                # lookahead for digit or .digit
    (?P<num>\d*)               # numerator (possibly empty)
    (?:                        # followed by
       (?:/(?P<denom>\d+))?    # an optional denominator
    |                          # or
       (?:\.(?P<decimal>\d*))? # an optional fractional part
       (?:E(?P<exp>[-+]?\d+))? # and optional exponent
    )
    \s*\Z                      # and optional whitespace to finish
""", re.VERBOSE | re.IGNORECASE)
于 2010-10-20T13:46:02.133 に答える
1

from_floatpy3k でエラーを再現することはできませんが、float をクラス メソッドに直接渡すことができます。

>>> fractions.Fraction.from_float(1.05204948186e+12)
Fraction(1052049481860, 1)
于 2010-10-20T13:10:23.280 に答える