Php错误的字符串相等

use*_*026 6 php string equality digits

出于某种原因,PHP决定:

$a = "3.14159265358979326666666666"

$b = "3.14159265358979323846264338"
Run Code Online (Sandbox Code Playgroud)

$a == $b 是真的.

为什么会这样,我该如何解决?它破坏了我的代码.

Mar*_*oma 6

问题

PHP将字符串(如果可能)转换为数字().浮点的精度有限(来源).所以,$a == $b由于舍入误差.

修复

使用===!==.

试试吧

<?php

$a = "3.14159265358979326666666666";
$b = "3.14159265358979323846264338";

if ($a == $b) {
    echo "'$a' and '$b' are equal with ==.<br/>";
} else {
    echo "'$a' and '$b' are NOT equal with ==.<br/>";
}

if ($a === $b) {
    echo "'$a' and '$b' are equal with ===.<br/>";
} else {
    echo "'$a' and '$b' are NOT equal with ===.<br/>";
}
?>
Run Code Online (Sandbox Code Playgroud)

结果是

'3.14159265358979326666666666' and '3.14159265358979323846264338' are equal with ==.
'3.14159265358979326666666666' and '3.14159265358979323846264338' are NOT equal with ===.
Run Code Online (Sandbox Code Playgroud)

注意

当你想要进行高精度数学时,你应该看看BC Math.


The*_*eox 4

===您可以在相等测试中使用。

$a = "3.14159265358979326666666666";
$b = "3.14159265358979323846264338";

if($a===$b)
{
    echo "ok";
}
else
{
    echo "nope";
}
Run Code Online (Sandbox Code Playgroud)

此代码将回显nope.

比较==是松散比较,两个字符串都会转换为数字,而不是立即比较。

使用===将执行字符串比较,无需类型转换,并将给出所需的结果。

您可以在 PHP 手册中找到更多解释: