從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,multiplication和division。
一個更好的例子
下面是同樣的例子以上,但使用bcadd()函數來算一算我們。它需要三個參數。前兩個是我們希望添加的值,第三個是我們希望精確到的小數位數。由於我們正在使用金錢,因此我們將精確度設置爲兩位十進制數。
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.
謝謝約翰。我試圖從1小時開始工作,但無法做到這一點。再次感謝。 – user427969