PHP的floor函數問題。

來源:互聯網
上載者:User

標籤:php   floor函數   



最近在寫一個有關金融的項目。裡面涉及到好多資金小數的問題。有一次用到floor想實現向下取整精確到兩位小數時,突然發現如下代碼不正常了。

$money=271.28;echo $money=floor($money*pow(10,2))/100
我驚訝的發現輸出的竟然不是271.28而是 271.27!

後來查了好多資料,在php官網上看到了這麼一點:

浮點數的精度有限,以十進位能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二進位精確表示,因此不能在不丟失一點點精度的情況下轉換為二進位的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118...。所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。 

後來我列印了一下上面運算的結果:

printf("%.12f", $money*pow(10,2));
發現結果是: 27127.999999999996

原來是精度問題。暫時還沒找到統一的解決辦法。我只有在代碼邏輯中加入

if ($money - round ( $money, 2 ) < 0.00001) {}else{$money=floor($money*pow(10,2))/100;}
來避免已經精確了兩位的資料再處理。

如果有人知道另一種實現我上述功能(精確到小數點後兩位無論第三位是什麼都捨棄)的方法請教教我。


PHP的floor函數問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.