PHP中如何对浮点数比较,方法是什么
Admin 2022-07-08 群英技术资讯 436 次浏览
前言
本文主要给大家介绍了关于利用php如何比较浮点数是否相等的相关内容,下面话不多说了,来一起看看详细的介绍吧
看下面这段代码, 0.9+0.1 的相加结果与 1 进行比较
<?php $a = 0.9; $b = 0.1; $total = $a + $b; var_dump($total); if (1 == $total) { echo "true"; } else { echo "false"; } echo "\n"; if (1.0 == $total) { echo "true"; } else { echo "false"; } ?>
打印结果是:
float(1)
true
true
再看下面这段代码, 0.6+0.1+0.1+0.1+0.1 的相加结果与 1 进行比较
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $total = $a + $b + $c + $d + $e; var_dump($total); if (1 == $total) { echo "true"; } else { echo "false"; } echo "\n"; if (1.0 == $total) { echo "true"; } else { echo "false"; } ?>
打印结果是:
float(1)
false
false
为什么这两段代码结果不一样?把两段代码里面的 $total 分别以精度20位的形式打印出来 printf("%.20f\n", $total); ,结果如下:
1.00000000000000000000
0.99999999999999988898
出现这个问题是因为浮点数计算涉及精度。
关于php里面的浮点数, 官方手册 上有相关解释
看官方手册里面关于浮点数的提示,如下图所示。里面提到 永远不要比较两个浮点数是否相等
那么有什么办法可以比较两个浮点数是否相等呢?
方法一、
看如下代码示例
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $epsilon = 0.00001; $total = $a + $b + $c + $d + $e; if(abs($total-1) < $epsilon) { echo "true"; } else { echo "false"; } echo "\n"; if(abs($total-1.0) < $epsilon) { echo "true"; } else { echo "false"; } ?>
结果输出为:
true
true
方法二、
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $total = $a + $b + $c + $d + $e; if(1.0 == round($total, 5)) { echo "true"; } else { echo "false"; } ?>
结果输出为:
true
总结
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中:Example#1动态访问元素example1.php:<?phpclassclassname...
make或make install无法执行或编译错误、php版本和编译时使用的phpize和php-config不对应、缺少mysql头文件、缺少pcre.h头文件、make install失败。
禁用掉可能带来安全隐患的函数防止外部注入调用这些函数,产生不必要的麻烦在php.
PHP中array_chunk函数:1、将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定。最后一个数组的单元数目可能会少几个;2、得到的数组是一个多维数组中的单元,其索引从零开始。
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:classS{public$test="pikachu";}$s=newS();//创建一个对象serialize($s);/
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008