作者FT6034 (耐心等待)
看板PHP
標題[請益] round四捨五入後, *100出問題
時間Tue Jun 3 16:01:57 2014
狀況如下:
$a = 0.9815 //使用 round() 取得
echo $a*100."%";
//出現 98.15000000000001%
$b = 0.8472 //使用 round() 取得
echo $a*100."%"; //出現 84.72%
$c = 0.8531 //使用 round() 取得
echo $c*100."%";
//出現 85.31999999999999%
請教這是什麼原因造成,應該如何修正?@@"
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.199.55
※ 文章網址: http://webptt.com/m.aspx?n=bbs/PHP/M.1401782519.A.434.html
※ 編輯: FT6034 (118.168.199.55), 06/03/2014 16:02:38
1F:→ dinos:浮點數精度問題,看要不要用bcmath,或是round再除小數位數 06/03 17:06
2F:推 LPH66:或者乘完 100 再做 round (當然精度要調整一下) 06/03 18:48
3F:→ LPH66:啊, 一樓有提了XD 不過 php 的 round 可以指定精度所以不必 06/03 18:49
4F:→ LPH66:先拉到整數位再 round 再除 06/03 18:49
謝謝 dinos 和 LPH66 的回覆
我發現只有在那個php檔裡,會出現這個問題
我開一個新檔,單純去測試運算部分,就會正常 @@"
例如:同樣是以下的程式碼,在該php裡有問題,開新的就沒問題
$a = 259;
$b = 244;
$c = $b/$a;
echo $c."<br />";
echo round($c, 4)."<br />";
echo (round($c, 4)*100)."<br />";
※ 編輯: FT6034 (118.168.199.55), 06/04/2014 08:43:47
5F:推 LPH66:這有點微妙, 你要不要試試乘完再 round? 06/04 16:34
6F:→ LPH66:原來是 round($x, 0.0001)*100 則改成 round($x*100, 0.01) 06/04 16:36
7F:→ LPH66:之所以微妙的原因是因為該 php 裡的值可能經過多重運算而來 06/04 16:37
8F:→ LPH66:因此不一定正好是你認為的那個數值 06/04 16:37
9F:推 hwChang:IEEE 754, |4-2.7.0.3| == 1 06/09 10:42
10F:→ hwChang:浮點數運算時,做判斷時要注意 :) 06/09 10:43
11F:→ hwChang:如同LPH說的,不一定正好是你認為的那個數值。 06/09 10:44
12F:→ hwChang:再試試 |3-2.7-0.3| == 0,可觀察運算後的值。 06/09 10:45