3

重複の可能性:
浮動小数点での単純な数学演算がVB.NetとPythonで予期しない(不正確な)結果を返すのはなぜですか?

Pythonでこれが発生する理由:

>>> 
>>> 483.6 * 3
1450.8000000000002
>>> 

私はこれが他の言語で起こることを知っています、そして私はこれを修正する方法を尋ねていません。私はあなたができることを知っています:

>>> 
>>> from decimal import Decimal
>>> Decimal('483.6') * 3
Decimal('1450.8')
>>> 

では、これが正確に発生する原因は何ですか?このような数学を行うときに、小数がわずかに不正確になるのはなぜですか?

コンピュータがこれを正しく行わない特定の理由はありますか?

4

3 に答える 3

5

浮動小数点数に関するPythonのドキュメントを参照してください。基本的に、浮動小数点数を作成するときは、2進数の算術を使用しています。1/3が.333....無限大になるのと同じように、ほとんどの浮動小数点数は基数2で正確に表現できません。したがって、結果が得られます。

Pythonインタープリターと他のいくつかの言語の違いは、他の言語ではこれらの余分な数字が表示されない場合があることです。これはPythonのバグではなく、ハードウェアが浮動小数点演算を使用して計算する方法です。

于 2013-01-16T22:18:34.437 に答える
4

コンピューターは、すべての浮動小数点数を完全に表すことはできません。

基本的に、浮動小数点数は科学的記数法で表されますが、基数2で表されます。次に、1/3(基数10)を科学的記数法で表してみてください。3 * 10 -1を試してみてください。さらに良いのは、33333333 * 10-8です。3を追加し続けることもできますが、正確な値が1/3になることはありません。ここで、2進科学記数法で1/10を表現してみてください。同じことが起こることがわかります。

Pythonの浮動小数点に関する良いリンクは次のとおりです

下位レベルのトピックを掘り下げると、コンピューターで浮動小数点がどのように表現されるかがわかります。たとえば、Cでは、浮動小数点数はこのスタックオーバーフローの質問で説明されているように表されます。小数を正確に表すことができない理由を理解するためにこれを読む必要はありませんが、何が起こっているのかをよりよく理解できる可能性があります。

于 2013-01-16T22:23:33.167 に答える
1

コンピューターは数値をビットとして(2進数で)格納します。残念ながら、メモリが無限であっても、たとえば、一部の小数を2進数で正確に表すことはできません0.31/3この概念は、 10進表記で正確に格納しようとするのと似ています。

于 2013-01-16T22:19:09.393 に答える