深入分析Php處理浮點數的問題

來源:互聯網
上載者:User

公司要對產品價格做調整,因為做的外貿商城,所以價格要和國際接軌。比如國外的價格展示方式是:$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. . .。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.