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

首先定义两个变量:

$a = 1.6;
$b = 8 - 6.4;

然后通过 var_dump 打印出这两个变量的信息

var_dump($a);   // float(1.6)
var_dump($b);   // float(1.6)
var_dump($a == $b)   //bool(false)

原来:$b变量在做减法运算后,小数精度和$a不一致


看看PHP官方的说明

图片.png php 比较两个浮点数是否相等 PHP

Warning  

浮点数的精度

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754   双精度格式,则由于取整而导致的最大相对误差为   1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或   0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10)   通常会返回 7 而不是预期中的   8,因为该结果内部的表示其实是类似   7.9999999999999991118...

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

参见» 浮点数指南网页的简单解释。

可以通过一下两种方法判断浮点型是否相等

方法一:

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

方法二:

bccomp: 比较二个高精确度数字

如果两个数相等返回0, 左边的数left_operand比较右边的数right_operand大返回1, 否则返回-1

<?php

echo bccomp('1', '2') . "\n";   // -1
echo bccomp('1.00001', '1', 3); // 0
echo bccomp('1.00001', '1', 5); // 1

?>


未经允许请勿转载:熊先生个人博客 » php 比较两个浮点数是否相等

赞一个 (0)

评论 沙了个发

换个身份

取消评论

分享:

支付宝

微信