公司要對產品價格作調整,由於作的外貿商城,因此價格要和國際接軌。好比國外的價格展現方式是:$35標識爲$35.00; $56.2標識爲:$56.20.php
經過sprintf(「%1\$.2f」,$price)解決了上面的需求,可是新的問題出現,有價格爲0的會處理爲0.00.字符串
經過empty()和判斷是否相等,沒法識別符點數0.00;經過百度總結了下面處理浮點數的方法。產品
浮點數0.00的處理class
經過intval轉換爲整形intval(0.00) 變爲0,只針對0.00使用intval處理;能夠看先的例子你就明白了。百度
例子1:二進制
$n=」19.99″;方法
print intval($n*100); //輸出的結構是1998,而不是1999;總結
print intval(strval($n*100));//這個輸出的纔是1999;數據
例子二:商城
echo floor((0.1+0.7)*10);//輸出的是7,而不是8;
echo floor(strval((0.1+0.7)*10));//這個纔是8;
在php中一些簡單的浮點數據在內部不能以精確的二進制來表示的。這和計算機的數據表示相關,即:不可能以有限的二進制來表示某些十進制的分數。永遠不要相信浮點數的結果精確到了最後一位, 也永遠不要比較兩個浮點數是否相等。
上面的2個例子,總結出php處理浮點數的方式是將其轉成字符串, 能夠經過strval或者使用printf/sprintf將浮點數轉成字符串.
浮點數精度
顯然簡單的十進制分數如同 0.1 或 0.7 不能在不丟失一點點精度的狀況下轉換爲內部二進制的格式。這就會形成混亂的結果:例如,floor((0.1+0.7)*10) 一般會返回 7 而不是預期中的 8,由於該結果內部的表示實際上是相似 7.9999999999...。
這和一個事實有關,那就是不可能精確的用有限位數表達某些十進制分數。例如,十進制的 1/3 變成了 0.3333333. . .。