今天在项目中遇到一个奇怪的问题,经过计算后的double类型的变量的值相等的两个变量进行比较,结果却是不相等。


<?php$a=42735.04;$b=17806.2;$c=$a/36;$c=round($c,2);$d=$c*15;echo'$bvalueis:'.$b."\n";echo'$dvalueis:'.$d."\n";if($b==$d){echo"ok\n";}else{echo"sorry\n";}


得到结果如下图,明明两个变量的值是一样的,做'=='比较运算却返回false





原因是php7中的浮点数 经过 /,*,round()等一系列运算后,精度发生了变化。


解决方案:将任意精度的变量作为字符串进行比较。


php7中已经提供较好的解决方案.

(PHP4,PHP5,PHP7)bccomp—比较两个任意精度的数字说明intbccomp(string$left_operand,string$right_operand[,int$scale=int])把right_operand和left_operand作比较,并且返回一个整数的结果.



最终使用bccomp()来进行比较解决问题

if(bccomp((string)$b,(string)$d,2)===0){echo"yes\n";}else{echo"no\n";}