php浮点数计算错误的原因
php  /  管理员 发布于 7年前   280
示例: (推荐学习:PHP视频教程)
echo intval(0.58*100);//结果为57echo intval((0.1 + 0.7) * 10);//结果为7
产生这样的原因是计算机内部对部分浮点数不能准确地用二进制表示,就像我们不能用十进制准确表示10/3一样.
浮点数在计算机内部的表示:IEEE 754.不懂的自己查找资料
也可以参考一下鸟哥这篇文章:http://www.laruence.com/2013/03/26/2884.html
<?phpecho intval(0.58*100);//57,注意啦echo '<br/>';echo intval(bcmul(0.58, 100));//58echo '<br/>';echo floor(strval(0.58*100));//58echo '<br/>';echo (int)(0.58 * 1000/10);//58echo '<br/>';echo intval((0.1 + 0.7) * 10);//7,注意啦echo '<br/>';echo intval(bcadd("0.1", "0.7",1) * 10); //8?>
再看一个例子
<?phpif((0.1 + 0.7) == 0.8){echo '相等'; }else{echo '不相等'; //这里输出}echo '<br />';$a = 0.1 + 0.7;echo $a; //0.8echo '<br/>';if($a == 0.8){ echo '一天一小步';}else{echo '一年一大步'; //这里输出}echo '<br/>';if(strval($a) == 0.8){echo '一天一小步'; //这里输出}else{echo '一年一大步'; }echo '<br/>';if(bcadd(0.1, 0.7,1) == 0.8){echo '一天一小步'; //这里输出}else{echo '一年一大步';}/*结果:不相等0.8一年一大步一天一小步一天一小步*/?>
$a = 0.00...00(n个0)1 + 0.7;用strval对$a进行取值的时候,会因为n个0的个数不同,导致$a和0.8是否相等的结果不同
而bcadd函数会对2个数相加,根据你选择保留几个小数,而舍弃后面的小数
看个除法例子:
<?phpecho 160500643816367088/10;//1.6050064381637E+16echo '<br/>';echo intval(160500643816367088/10);//16050064381636710echo '<br/>';echo bcdiv(160500643816367088,10);//16050064381636708?>
所以对于浮点数来计算金额这些敏感的数据,推荐使用PHP的BC函数
以上就是php浮点数计算错误的原因的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号