2

重複の可能性:
浮動小数点の制限

ここでPython2.7を使用します。

誰かがこれがシェルで発生する理由を説明できますか?

>>> 5.2-5.0
0.20000000000000018

検索すると、さまざまなスケールの数値(非常に小さい数値と非常に大きい数値)が得られませんでしたが、それはかなり一般的なようで、使用している数値が同じスケールであることを考えると、私は思いませんそれがこれが起こる理由です。

編集:私が意味した「このことが起こっている」とは、単に0.2になるのではなく、0.2...018を返すことであるとは定義しなかったと思います。誤解を招く可能性があるため、その印刷ラウンドを取得し、コードスニペットの印刷部分を削除しました。

4

4 に答える 4

5

5.2-5.0は実際には0.2ではなく0.20000000000000018であることを理解する必要があります。これに関する標準的な説明は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことにあります。

そのすべてを読みたくない場合は、5.2、5.0、および0.20000000000000018がすべて単なる概算であり、コンピューターが実際の数値に近づくことができる限り、それを受け入れてください。

Pythonには、すべてのコンピューターサイエンティストが知っておくべきことを知らなくても、それを回避できるようにするためのトリックがいくつかあります。主なトリックは、つまり、人間が読み取れる浮動小数点数の表現がstr(f)有効数字12桁に切り捨てられるため、ではなく、であるということです。ただし、取得できるすべての精度が必要な場合もあるため、つまり、機械可読レンディションは切り捨てられません。また、も切り捨てられません。str(5.2-5.0)"0.2""0.20000000000000018"repr(f)repr(5.2-5.0)"0.20000000000000018"

今、理解しなければならないのは、インタープリターシェルが何をするかだけです。Ashwini Chaudharyが説明しているように、シェルで何かを評価するだけでそのが出力されreprprintステートメントではそのが出力されますstr

于 2012-09-25T22:06:05.647 に答える
2

シェルは使用しますrepr()

In [1]: print repr(5.2-5.0)
0.20000000000000018

In [2]: print str(5.2-5.0)
0.2

In [3]: print 5.2-5.0
0.2
于 2012-09-25T21:59:57.680 に答える
1

のデフォルトの実装でfloat.__str__は、出力が12桁のみに制限されています。

したがって、最下位桁は削除され、残っているのは値0.2です。

より多くの桁を印刷するには(使用可能な場合)、文字列フォーマットを使用します。

print '%f' % result  # prints 0.200000

デフォルトは6桁ですが、より正確に指定できます。

print '%.16f' % result  # prints 0.2000000000000002

または、Pythonは新しい文字列フォーマット方法も提供しています。

print '{0:.16f}'.format(result)  # prints 0.2000000000000002

そもそもPythonが「不正確な」結果を生成する理由は、浮動小数点演算の不正確な性質と関係があります。より予測可能な精度が必要な場合は、代わりにdecimalモジュールを使用してください。

>>> from decimal import *
>>> getcontext().prec = 1
>>> Decimal(5.2) - Decimal(5.0)
Decimal('0.2')
于 2012-09-25T21:58:51.837 に答える
0

Pythonには、オブジェクトを文字列に変換する2つの異なる方法、__str__および__repr__メソッドがあります。__str__通常の文字列出力を意味し、print;によって使用されます。__repr__より正確な表現を意図しており、を使用しない場合print、またはリストや辞書の内容を印刷する場合に表示されます。 __str__浮動小数点値を丸めます。

減算の実際の結果が正確に0.2ではなく0.20000000000000018である理由については、浮動小数点の内部表現と関係があります。5.2は無限に繰り返される2進数であるため、正確に表現することはできません。あなたが来ることができる最も近いものはおよそ5.20000000000000018です。

于 2012-09-25T22:04:13.940 に答える