首頁  >  文章  >  後端開發  >  PHP的floor函數問題。

PHP的floor函數問題。

WBOY
WBOY原創
2016-08-08 09:31:091548瀏覽



最近在寫一個有關金融的專案。裡面牽涉到好多資金小數的問題。有一次用到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 而不是預期中的 7 而不是預期中的 8 而不是預期中的 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函數問題。 ,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn