2017-03-20 1 views
2

分数ベースで整数の重複表現を検索するプログラムを作成しようとしています。したがって、私はこのようなことをしなければならない:正しい小数の結果を得るには

1.1**7 

これは1.9487171に等しい。しかし、pythonはその結果をfloatとして自動的に表しますが、与えられた値はexactです。これは私が必要とするもので、浮動小数点を丸めるのと同じではありません。また、小数点以下の桁数を指定できるようにする必要があります。私はdecimalモジュールを使ってみましたが、うまく動作するようにはできません。これを行う最善の方法は何でしょうか?

+0

答えはほぼ10進数のモジュールです。どのようにしてそれを働かせることはできませんか? 'fractions'モジュールも役立つかもしれません。 –

+0

これをお読みください:https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlこれに対処する最善の方法は 'decimal'モジュールを使うことです。どうやって「うまくいくの? –

+0

Decimal( '1.1 ** 7')を実行し、エラーメッセージが表示されました。 –

答えて

2

decimal moduleはあなたに正確な結果を得られます:非小数拠点については

>>> Decimal('1.1') ** 7 
Decimal('1.9487171') 

fractions moduleを正確な算術演算を行います。

>>> Fraction(3, 7) ** 5 
Fraction(243, 16807) 
>>> Context(prec=200).divide(243, 16807) 
Decimal('0.014458261438686261676682334741476765633367049443684179211043017790206461593383709168798714821205450110073183792467424287499256262271672517403462842863092758969477003629440114238115071101326828107336229') 
+0

それを与えることを試みなさい! –

3

decimal.Decimal引数は文字列である必要があります。あなたがfloatを使用している場合、それは不正確だ沿って運ぶ:

>>> decimal.Decimal('1.1')**7 
Decimal('1.9487171') 
>>> 

VS

>>> decimal.Decimal(1.1)**7 
Decimal('1.948717100000001101423574568') 
>>> 
-1

あなたがに等しいかどうかをチェックしたことがあります:唯一の問題は、しかし、出力が分数の形ではなく、あなたが探しているように見えること(シーケンス、繰り返し非終了との可能性が高い)進数を示すということです公差内で?例えば。

def approx(left, right, tolerance=1**10-6): 
    if left - right < tolerance: 
     return True 
    else: 
     return False 
2

分数拠点

なし、fractionsのような音?

>>> import fractions 
>>> fractions.Fraction(11, 10) ** 7 
Fraction(19487171, 10000000) 
>>> fractions.Fraction(13, 11) ** 7 
Fraction(62748517, 19487171) 
+0

はい、質問を読み返す際には、これが受け入れられる回答であるべきだと思います。 –

関連する問題