2012-05-11 173 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?

感謝您的幫助。

回答

15

an article I wrote for Authorize.Net(在特定情況下$num_int1是即使它看起來像一個整數一個浮點數):

一加一等於二,對吧?怎麼樣.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 extension它是「爲任意精度數學PHP提供支持的任何尺寸和精度,表示爲字符串的號碼二進制計算器」。換句話說,你可以用這個擴展名用貨幣值做精確的數學運算。 BC Math extension contains function s允許您以精確度執行最常見的操作,包括addition,subtraction,multiplicationdivision

一個更好的例子

下面是同樣的例子以上,但使用bcadd()函數來算一算我們。它需要三個參數。前兩個是我們希望添加的值,第三個是我們希望精確到的小數位數。由於我們正在使用金錢,因此我們將精確度設置爲兩位十進制數。

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

謝謝約翰。我試圖從1小時開始工作,但無法做到這一點。再次感謝。 – user427969