-2

重複の可能性:
php
はfloatを計算しますPHPのfloat計算の精度

PHPがこのために-2.27373675443E-13を計算するのはなぜですか...

echo  (89.99*12) - 1079.88;

0を返すべきではありませんか?

4

1 に答える 1

4

浮動小数点の計算は複雑で、不正確になる可能性があります。10進数はバイナリ表現で完全に格納できないため、この問題はすべてのプログラミング言語で発生します。

これに関するPHPのドキュメントを引用するには:

警告
浮動小数点の精度

浮動小数点数の精度には制限があります。システムによって異なりますが、PHPは通常IEEE 754倍精度形式を使用します。これにより、1.11e-16のオーダーの丸めにより、最大の相対誤差が発生します。非初等算術演算ではエラーが大きくなる可能性があります。もちろん、複数の演算が複合されている場合は、エラーの伝播を考慮する必要があります。

さらに、0.1や0.7のように、基数10の浮動小数点数として正確に表現できる有理数は、仮数のサイズに関係なく、内部で使用される基数2の浮動小数点数として正確に表現されません。したがって、精度を少し損なうことなく、対応する内部バイナリに変換することはできません。これにより、混乱を招く結果が生じる可能性があります。たとえば、floor((0.1 + 0.7)* 10)は、内部表現が7.9999999999999991118 ...のようになるため、通常、期待される8ではなく7を返します。

したがって、浮動小数点数の結果を最後の桁まで信頼しないでください。また、浮動小数点数を直接比較して等しいかどうかを確認しないでください。より高い精度が必要な場合は、任意精度の数学関数とgmp関数を使用できます。

于 2012-06-25T11:53:37.950 に答える