php如何比较两个浮点数是否相等详解


Posted in PHP onFebruary 12, 2019

前言

本文主要给大家介绍了关于利用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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP的中问验证码
Nov 25 PHP
php for 循环语句使用方法详细说明
May 09 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
php缓冲输出实例分析
Jan 05 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
创建无限极分类树型结构的简单方法
Jun 20 PHP
PHP基于array_unique实现二维数组去重
Jul 14 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 #PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 #PHP
PHP chunk_split()函数讲解
Feb 12 #PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 #PHP
PHP chr()函数讲解
Feb 11 #PHP
PHP chop()函数讲解
Feb 11 #PHP
PHP bin2hex()函数基础实例讲解
Feb 11 #PHP
You might like
第六节--访问属性和方法
2006/11/16 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python3安装Scrapy的方法步骤
2017/11/23 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
2014年秋季开学典礼致辞
2014/08/02 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
2014企业年终工作总结
2014/12/23 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
Python图像处理之图像拼接
2021/04/28 Python
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
MySQL GTID复制的具体使用
2022/05/20 MySQL
关于mysql中string和number的转换问题
2022/06/14 MySQL