php比较两个浮点数是否相等

栏目: PHP · 发布时间: 7年前

内容简介:看下面这段代码,打印结果是:再看下面这段代码,

看下面这段代码, 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比较两个浮点数是否相等

那么有什么办法可以比较两个浮点数是否相等呢?

方法一、

看如下代码示例

<?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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

程序员的数学3

程序员的数学3

[日] 平冈和幸、[日] 堀玄 / 卢晓南 / 人民邮电出版社 / 2016-3 / 79.00元

本书沿袭“程序员的数学”系列平易近人的风格,用通俗的语言和具象的图表深入讲解了编程中所需的线性代数知识。内容包括向量、矩阵、行列式、秩、逆矩阵、线性方程、LU分解、特征值、对角化、Jordan标准型、特征值算法等。一起来看看 《程序员的数学3》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具