3

PHPで以下の出力を説明できる人はいますか?

$num1 = (1.65 - 1.00);
echo "<br><br>num1 = " . $num1;   // Output: int = 0.65

$num_int1 = $num1 * 100;
echo "<br><br>int = " . $num_int1;   // Output: int = 65

$num_int2 = (int) $num_int1;
echo "<br><br>int = " . $num_int2;   // Output: int = 64

なぜ $num_int2 は 64 なのですか?

手伝ってくれてありがとう。

4

1 に答える 1

15

私が 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.
于 2012-05-11T00:41:08.940 に答える