JavaScript では、この数学演算は次を返します。
1913397 / 13.054 = 146575.53240386088
ただし、php で同じ操作を行うと、次のように返されます。
1913397 / 13.054 = 146575.53240386
これは丸めのせいだと思います。
どうすればphpの精度を拡張できますか?
JavaScript では、この数学演算は次を返します。
1913397 / 13.054 = 146575.53240386088
ただし、php で同じ操作を行うと、次のように返されます。
1913397 / 13.054 = 146575.53240386
これは丸めのせいだと思います。
どうすればphpの精度を拡張できますか?
1プラス1は2に等しいですよね?.2プラス1.4×10はどうですか?それは16に等しいですよね?PHP(または他のほとんどのプログラミング言語)で数学をしている場合は違います:
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
これは、浮動小数点数が内部でどのように処理されるかによるものです。それらは小数点以下の桁数が固定されて表され、期待どおりに合計されない数値になる可能性があります。内部的には、.2 + 1.4 x 10の例は、およそ15.9999999998程度に計算されます。この種の計算は、パーセンテージのように正確である必要のない数値を処理する場合に適しています。しかし、お金を扱うときは、1セント硬貨や1ドルがここかそこに欠けているので、精度が重要になります。
BC数学ソリューション
幸い、PHPはBC Math拡張機能を提供しています。これは、「任意精度の数学のために、PHPは、文字列として表される任意のサイズと精度の数値をサポートするバイナリ計算機を提供します」。つまり、この拡張機能を使用して、金額で正確な計算を行うことができます。BC Math拡張機能には、加算、減算、乗算、除算など、最も一般的な演算を正確に実行できる関数が含まれています。
より良い例
上記と同じ例ですが、bcadd()関数を使用して計算を行います。3つのパラメータを取ります。最初の2つは追加したい値で、3番目は正確にしたい小数点以下の桁数です。お金を使って作業しているので、精度を小数点以下2桁に設定します。
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.