質問: いつもこちらのサイトではお世話になっております。 phpで作る計算ツールについて、1つ質問させて下さい。 以下のコードで、While文を使って計算すると正しく計算されません。 直接、$bに数字を入れると正しく計算されます。 以下のコードで間違いがあったらお教えください。 どうぞよろしくお願い申し上げます。 ``` ``` ■試してみたこと ・$bに数字の1を代入→正しく計算される。 ・$bに数字の0.01を代入→繰り返し処理はされるが間違った答えが算出される。 ・$b+=0.01;の直下にecho "$b";で出力→ While文で正しく0.01ずつ増えるが、$twrが正しく算出されない。 ・「$aと$dは本来、POSTにより数値の状態で受け取る」 ■環境 レンタルサーバー(ロリポップ)に、phpファイルをアップし、ブラウザで閲覧する形で、ツールを作っております。 ■追加情報 ・「$aと$dは本来、POSTにより数値の状態で受け取る」
回答: BC Math 関数 を使えばよいのでは。 【PHP: 浮動小数点数 - Manual】 > > 警告 > > 浮動小数点数の精度 > > > 浮動小数点数の精度は有限です。 システムに依存しますが、PHP は通常 IEEE 754 倍精度フォーマットを使います。 この形式は、1.11e-16 のオーダーでの丸め処理で誤差が発生します。 複雑な算術演算をすると、誤差はさらに大きくなるでしょう。そしてもちろん、 いくつかの演算を組み合わせる場合にも誤差を考慮しなければなりません。 > > > さらに、十進数では正確な小数で表せる有理数、たとえば 0.1 や 0.7 は、 二進数の浮動小数点数としては正確に表現できません。 これは、仮数部をいくら大きくしても同じです。 したがって、それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。 その結果、不思議な結果を引き起こすことがあります。たとえば、 floor((0.1+0.7)*10) の結果はたいてい 7 となるでしょう。おそらくは 8 を想定していらっしゃるでしょうが、そのようにはなりません。 これは、(この計算結果の) 内部的な値が 7.9999999999999991118... のようになっているからです。 > > > よって、小数の最後の桁を信用してはいけませんし、 小数を直接比較して等しいかどうかを調べてはいけません。より高い精度が必要な場合には、 任意精度数学関数または gmp 関数を代わりに使用してください。 > > > 【[PHP]PHPで小数計算する? | マリンロード】 【小数点計算での数値の違い】