最近在寫乙個有關金融的專案。裡面涉及到好多資金小數的問題。有一次用到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
來避免已經精確了兩位的資料再處理。
如果有人知道另一種實現我上述功能(精確到小數點後兩位無論第三位是什麼都捨棄)的方法請教教我。
floor函式,ceil函式
floor函式 數值向下取整 ceil函式 將數值轉換為大於或等於它的最小整數 sqrt 求平方根 上記函式都在math模組中 import math math.floor 19.6 19.0 math.ceil 19.3 20.0 math.sqrt 16 4.0 另一種呼叫方式,不用每次呼叫時都...
floor函式 ceil函式
floor函式 floor x 有時候也寫做floor x 其功能是 向下取整 或者說 向下捨入 即取不大於x的最大整數 與 四捨五入 不同,下取整是直接取按照數軸上最接近要求的值左邊的值,也就是不大於要求的值的最大的那個 標頭檔案 include math.h 例如 x 6.04 y floor ...
Matlab基本函式 floor函式
1 floor函式 朝負無窮大方向取整 2 用法說明 y floor x 函式將x中元素取整,值y為不大於本身的最大整數。對於複數,分別對實部和虛部取整 3 用法舉例 x 3 4i 6 7i 9 11i 1 4i 3.4 4.5i 90.67 123i x 1.0e 02 columns 1 thr...