深入分析Php处理浮点数的问题
公司要對產品價格做調整,因為做的外貿商城,所以價格要和國際接軌。比如國外的價格展示方式是:$35標識為$35.00; $56.2標識為:$56.20.
通過sprintf(“%1\$.2f”,$price)解決了上面的需求,但是新的問題出現,有價格為0的會處理為0.00.
通過empty()和判斷是否相等,無法識別符點數0.00;通過百度總結了下面處理浮點數的方法。
浮點數0.00的處理
通過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. . .。
轉載于:https://www.cnblogs.com/focai/p/4452821.html
總結
以上是生活随笔為你收集整理的深入分析Php处理浮点数的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vmware 中安装Unix
- 下一篇: 关于equals和hashcode方法