重複の可能性:
二重乗算は .NET で壊れていますか?
float 型から int 型への PHP の予期しない結果のキャスト
echo (int) ( (0.1+0.7) * 10);
答えは 7 ですが、8 ではありません。
echo (int) ( (0.1+0.8) * 10);
正しい答え 9 を与える
どうしたの?誰でも説明できますか
サンクス、ナビ
重複の可能性:
二重乗算は .NET で壊れていますか?
float 型から int 型への PHP の予期しない結果のキャスト
echo (int) ( (0.1+0.7) * 10);
答えは 7 ですが、8 ではありません。
echo (int) ( (0.1+0.8) * 10);
正しい答え 9 を与える
どうしたの?誰でも説明できますか
サンクス、ナビ
試す
echo (float) ( (0.1+0.7) * 10);
それは正常です – 浮動小数点数を扱う際には、精度と呼ばれるものがあります。現代の言語のほとんどに存在します。詳細については、 http ://www.mredkj.com/javascript/nfbasic2.htmlを参照してください。
((0.1+0.7) * 10)
おそらく次のようなもの7.9999999
です(int) 7.9999999 = 7
一方、((0.1+0.8) * 10)
おそらく9.00000001
(int)9.00000001 = 9
浮動小数点数の精度は限られています。システムにもよりますが、PHP は通常、IEEE 754 倍精度形式を使用します。これは、1.11e-16 のオーダーで丸められるため、相対誤差が最大になります。非初等算術演算はより大きな誤差を与える可能性があり、もちろん、いくつかの演算が複合されている場合は誤差の伝播を考慮する必要があります。
さらに、0.1 や 0.7 のように、基数 10 の浮動小数点数として正確に表現できる有理数は、仮数のサイズに関係なく、内部で使用される基数 2 の浮動小数点数として正確に表現できません。したがって、精度をわずかに低下させることなく、内部のバイナリ対応物に変換することはできません。これにより、混乱を招く結果が生じる可能性があります。たとえば、floor((0.1+0.7)*10) は通常、予想される 8 ではなく 7 を返します。これは、内部表現が 7.9999999999999991118....
したがって、浮動小数点数の結果を最後の桁まで信頼したり、浮動小数点数を直接比較して等しいかどうかを確認したりしないでください。より高い精度が必要な場合は、任意精度の数学関数と gmp 関数を使用できます。
フロートを使用する
echo (float) ( (0.1+0.7) * 10);
それはあなたに完璧な答えを与えるでしょう
試す
echo (int) round( ( (0.1+0.7) * 10));
これにより、浮動小数点計算エラーが補正されます。