2016-11-07 12 views
8

Pythonでは、fractions.Fractiondecimal.Decimalの標準ライブラリクラスが存在し、有理数の計算を正確に保つのに役立ちます。それは助けどこのなじみのない、例えば:私はFractionを持っている場合分数を小数点以下に変換する最良の方法。

>>> 1/10 * 3 
0.30000000000000004 
>>> decimal.Decimal('1')/10 * 3 
Decimal('0.3') 
>>> fractions.Fraction('1')/10 * 3 
Fraction(3, 10) 

私の質問は、ある、Decimalに変換するための最良の方法は何ですか?

残念ながら、明白な解決策は動作しません:とき私は実際に出力この値は、意志を丸め任意の量の、今

>>> decimal.Decimal(float(fractions.Fraction(3, 10))) 
Decimal('0.299999999999999988897769753748434595763683319091796875') 

>>> decimal.Decimal(fractions.Fraction(3, 10)) 
Traceback (most recent call last): 
    ... 
TypeError: conversion from Fraction to Decimal is not supported 

は、今のところ私はこのコードを使用していますそれを0.3に変換し、出力の直前にこの変換を行います(すべてのコアの計算はFractionで行われます)。それでも、Fraction(3, 10)からDecimal('0.3')を得ることができないということは私にはちょっとばかげているようです。どんな助けもありがとう!

+1

「Pythonでの、 'fractions.Fraction'と' decimal.Decimal'標準ライブラリクラスは、正確な有理数で算術演算を保つのを助けるために存在しています。」まあまあ。 'Decimal.decimal'はまだ浮動小数点ですが、それはちょうど10進の浮動小数点です。 'Decimal(1)/ Decimal(3)'は正確な答えを与えることはできません。 –

答えて

11

フラクションの除算をDecimal()に残すのはどうですか?

def decimal_from_fraction(frac): 
    return frac.numerator/decimal.Decimal(frac.denominator) 

これは(単に分子を分母で割る)Fraction.__float__()が何をするかですが、出力を制御するために取得Decimalオブジェクトに2つの値のうち少なくとも一つを回して。

これは、あなたがdecimalコンテキストを使用することができます:

>>> decimal_from_fraction(fractions.Fraction(3, 10)) 
Decimal('0.3') 
>>> decimal_from_fraction(fractions.Fraction(1, 55)) 
Decimal('0.01818181818181818181818181818') 
>>> with decimal.localcontext() as ctx: 
... ctx.prec = 4 
... decimal_from_fraction(fractions.Fraction(1, 55)) 
... 
Decimal('0.01818') 
+0

素晴らしい!これは完璧です、ありがとうございます! –

+3

他の方法でクラスメソッド 'from_decimal'によって変換がサポートされる理由はありますか? 'frac = fractions.Fraction.from_decimal(decimal.Decimal( '0.3'))'は有効ですが、 'Decimal'の' from_fraction'メソッドはありません。 – roganjosh

+0

@roganjosh: 'float()'( '__float__'の形式)の間に値を変換するための標準的なフックはありません。あなたはプロジェクトで機能リクエストを提出することができます。 –

関連する問題