2012-05-11 13 views
3

誰でも以下の出力をPHPで説明できますか?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ですか?

ありがとうございました。 an article I wrote for Authorize.Netから

答えて

15

(あなたの特定のケース$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 plus 1.4 times 10の例は、およそ15.9999999998程度になります。パーセンテージのように正確である必要のない数値を扱う場合、この種の数学はうまくいきます。しかし、お金の精密な問題を扱うときは、ペニーやドルがここで欠落したり、すぐに追加されたり、欠けている金額の短期間に誰もが好きではありません。

BC数学ソリューションは

幸いPHPはあるBC Math extension提供しています「任意精度数学のためのPHPは文字列として表された任意の大きさと精度の数をサポートするバイナリ計算機を提供しています。」言い換えれば、この拡張を使用して金銭的価値を持つ正確な数学を行うことができます。 addition,subtraction,およびdivisionを含む最も一般的な操作を精度で実行できるようにするBC Math extension contains functionです。

Aより良い例

は、ここでは上記のが、私たちのために数学をやってbcadd()関数を使用するのと同じ例です。 3つのパラメータが必要です。最初の2つは追加したい値で、3番目は正確な小数点以下の桁数です。私たちはお金で作業しているので、小数点以下2桁の精度を設定します。

echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be. 
+0

ありがとうございます。私は1時間以来これを解決しようとしていましたが、それはできませんでした。再度、感謝します。 – user427969

関連する問題