PHP中如何对浮点数比较,方法是什么
Admin 2022-07-08 群英技术资讯 395 次浏览
前言
本文主要给大家介绍了关于利用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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
for 循环的语法逻辑格式和我们之前看到的 while 和 do while 两种循环语句有点不同,for 循环将控制循环次数的变量预先定义在 for 语句中。for 循环大多用于预先知道循环需要运行的次数的情况。
今天小编就为大家分享一篇关于PDO::quote讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
php框架的底层原理:1、PHP实现了典型的动态语言执行过程。2、底层原理分析,Zend整体是纯c实现的,是PHP的核心部分,将PHP代码翻译,实现opcode的处理。
在php的开发中,我们常常需要使用到header函数头来进行做标记header() 函数向客户端发送原始的 HTTP 报头。
在之前的文章中给大家带来了《一定搞得懂PHP中如何添加图片水印》,其中通过过示例给大家详细介绍了在PHP中应该如何添加水印,本篇文章我们继续来看一下PHP中错误处理的相关知识,希望能帮助到大家!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008