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

 更新时间:2019年02月12日 10:17:23   作者:nemo  
这篇文章主要给大家介绍了关于php如何比较两个浮点数是否相等的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

本文主要给大家介绍了关于利用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闭包定义与使用简单示例

    这篇文章主要介绍了PHP闭包定义与使用,结合简单实例形式分析了php闭包的简单定义、使用方法及相关注意事项,需要的朋友可以参考下
    2018-04-04
  • 解析smarty 截取字符串函数 truncate的用法介绍

    解析smarty 截取字符串函数 truncate的用法介绍

    本篇文章是对smarty 截取字符串函数 truncate的用法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • JS实现php的伪分页

    JS实现php的伪分页

    假如某一个页面的数据很多,不方便全都显示出来,而且假设里面有个播放器,不希望在翻页的时候播放器会终止的话,就可以采用这个方法尽管可以用Ajax,但是在数据比较少的情况下,这个方法更有优势
    2008-05-05
  • php 多进程编程父进程的阻塞与非阻塞实例分析

    php 多进程编程父进程的阻塞与非阻塞实例分析

    这篇文章主要介绍了php 多进程编程父进程的阻塞与非阻塞,结合实例形式分析了php 多进程编程中父进程的阻塞、等待、子进程退出、非阻塞等相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • PHP中for与foreach的区别分析

    PHP中for与foreach的区别分析

    foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误,在PHP5中也能遍历对象。
    2011-03-03
  • PHPLog php 程序调试追踪工具

    PHPLog php 程序调试追踪工具

    本文将为你介绍一个调试工具,它可以替代echo,print_r,var_dump等系统函数,还具有调用栈及参数追踪功能. 简言之,它是debug_backtrace的web版本.
    2009-09-09
  • PHP spl_autoload_register实现自动加载研究

    PHP spl_autoload_register实现自动加载研究

    spl_autoload_register()函数应该是主流框架使用最多的也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简化了类的调用与加载,提高了工作的效率
    2011-12-12
  • PHP函数func_num_args用法实例分析

    PHP函数func_num_args用法实例分析

    这篇文章主要介绍了PHP函数func_num_args用法,结合实例形式较为详细的分析了func_num_args函数返回函数参数的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • How do I change MySQL timezone?

    How do I change MySQL timezone?

    The MySQL timezone is set to MST (-7 hours GMT/UTC) and is not configurable by you. MySQL is only capable of having 1 timezone setting per mysql daemon. Therefore, you cannot select NOW() and expect a result in a timezone other than MST.
    2008-03-03
  • 基于php数组中的索引数组和关联数组详解

    基于php数组中的索引数组和关联数组详解

    下面小编就为大家分享一篇基于php数组中的索引数组和关联数组详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03

最新评论