作者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/cn.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