私が Authorize.Net のために書いた記事から(あなたの特定のケース$num_int1
では、整数のように見えても浮動小数点数です):
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 かける 10 の例は、およそ 15.9999999998 程度に計算されます。この種の計算は、パーセンテージのように正確である必要のない数値を扱う場合に適しています。しかし、お金を扱う場合、どこかで不足しているペニーまたはドルがすぐに追加され、不足しているお金が不足していることを好む人はいないため、精度が重要です。
BC数学ソリューション
幸いなことに、PHP はBC Math 拡張機能を提供しています。これは、「任意精度の数学のために、PHP は、文字列として表される任意のサイズと精度の数値をサポートする Binary Calculator を提供します」。つまり、この拡張機能を使用して、金額を正確に計算できます。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.