加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php如何比较两个浮点数是否相等介绍

发布时间:2022-07-14 11:58:46 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要给大家介绍了关于php如何比较两个浮点数是否相等的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。 前言 本文主要给大家介绍了关于利用php如何比较浮点数是否相等
  这篇文章主要给大家介绍了关于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("%.20fn", $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

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读