出于某种原因,PHP决定:if:
$a = "3.14159265358979326666666666"
$b = "3.14159265358979323846264338"
$a == $b
是真的。
为什么会这样,我该如何解决?它毁了我的代码。
答案 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)
如果您将数字与字符串进行比较或比较涉及 数字字符串,然后每个字符串转换为一个数字和 比较数字化。这些规则也适用于交换机 声明。比较时不会进行类型转换 是===或!==因为这涉及比较类型以及 值。
其他人推荐使用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)