重複の可能性:
なぜ99.99 / 100=0.9998999999999999
浮動小数点数の精度の問題に対処するのか
私はこの問題をphpとjavascriptで見ました。私はこの番号を持っています:float 0.699
これを行う場合:0.699 x 100 = 69.89999999999999
なぜ?
編集
round(0.699 x 10, 2)
:フロート69.90000000000001
重複の可能性:
なぜ99.99 / 100=0.9998999999999999
浮動小数点数の精度の問題に対処するのか
私はこの問題をphpとjavascriptで見ました。私はこの番号を持っています:float 0.699
これを行う場合:0.699 x 100 = 69.89999999999999
なぜ?
編集
round(0.699 x 10, 2)
:フロート69.90000000000001
浮動小数点演算は正確ではありません。
問題の詳細については、ウィキペディアの浮動小数点を参照してください。
これは過去に私を助けたものです。それは、物事がバイナリでどのように表されるかと多くの関係があります。基本的に2進数で短い長い話は、大きな数のすべての実数の正確な数はありません。
以下のリンクはあなたのためにそれをより詳細に説明します。
これはどの言語でも起こります。フロートは、コンピューター上の他のすべてのものと同様に、バイナリとして保存されます。数値0.699は、正確に10進数で表すことができますが、おそらく2進数の循環小数であるため、正確な精度で格納することはできません。
フロートがどのように保存されるか、そしてなぜこれが起こるのかについては、ウィキペディアのエントリをチェックしてください。
Javascript番号は浮動小数点です。
完全なJavaScript番号リファレンスをご覧ください。抜粋:
Javascriptのすべての数値は、64ビット(8バイト)の浮動小数点数であり、この記事の執筆時点で5e-324(負)から1.7976931348623157e + 308(正)の有効範囲になります(これは、最終的に128ビットに変更される可能性があります。 64ビットプロセッサが一般的になり、ECMA標準が進化するにつれて将来的になります)。
整数は、15桁(9e15)1に対して信頼できる(ピリオドまたは指数表記のない数値)と見なされます。浮動小数点数は、可能な限り信頼できると見なされ、それ以上は考慮されません。0.06 + 0.01は0.07ではなく0.06999999999999999に解決されるため、これは通貨操作について理解するための特に重要な概念です。
浮動小数点、特にIEEE754と表現可能な数値のセクションを見てください。
この動作は、C++やアセンブリを含む多くのプログラミング言語で再現できます。その理由は、FPUによる浮動小数点フォーマットを使用しているためです。あなたはここで詳細を読むことができます:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_14/CH14-1.html#HEADING1-19
一般的な規則:浮動小数点演算の正確な結果を期待しないでください。2つの浮動小数点数を比較しないでください。たとえば、間隔を使用します。たとえば、f1 == f2をテストする代わりに、f1>(f2 -e)とf1 <(f2 + e)を使用します。eは小さな値です。