Php错误的字符串相等

时间:2014-03-28 09:47:59

标签: php string equality digits

出于某种原因,PHP决定:if:

$a = "3.14159265358979326666666666"

$b = "3.14159265358979323846264338"

$a == $b是真的。

为什么会这样,我该如何解决?它毁了我的代码。

5 个答案:

答案 0 :(得分:6)

问题

PHP将字符串(如果可能)转换为数字(source)。浮点的精度有限(source)。因为舍入错误,所以$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/>";
}
?>

结果

'3.14159265358979326666666666' and '3.14159265358979323846264338' are equal with ==.
'3.14159265358979326666666666' and '3.14159265358979323846264338' are NOT equal with ===.

注意

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

答案 1 :(得分:4)

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

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

if($a===$b)
{
    echo "ok";
}
else
{
    echo "nope";
}

此代码将回显nope

==比较是一个松散的比较,两个字符串都将转换为数字,而不是立即进行比较。

使用===将执行字符串比较,不进行类型转换,并为您提供所需的结果。

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

答案 2 :(得分:1)

阅读PHP: Comparison Operators

  

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字化。这些规则也适用于交换机   声明。比较时不会进行类型转换   是===或!==因为这涉及比较类型以及   值。

其他人推荐使用BC Math,但如果你正在进行浮点比较,那么比较数字的传统方法是看它们是否与合理的错误级别相同

$epsilon = 1.0e-10;
if (abs($a - $b) < $epsilon) then {
    // they're the same for all practical purposes
}

答案 3 :(得分:1)

尝试使用$a === $b代替;你永远不应该使用==进行字符串比较。

答案 4 :(得分:1)

你不应该像那样比较浮动变量。 试试这个:

bccomp($a, $b, 26)