最近在寫一個有關金融的專案。裡面牽涉到好多資金小數的問題。有一次用到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教程有興趣的朋友有所幫助。 🎜
🎜
🎜