错误的PHP字符串相等性

问题描述 投票:6回答:5

出于某种原因,PHP决定是否:

$a = "3.14159265358979326666666666"

$b = "3.14159265358979323846264338"

$a == $b为真。

为什么这样做,我该如何解决?

破坏了我的代码。

php string equality digits
5个回答
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


4
投票

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


1
投票

尝试使用$a === $b代替;您绝对不要使用==进行字符串比较。


1
投票

读取PHP: Comparison Operators

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


1
投票

您不应该这样比较float变量。

尝试一下:

© www.soinside.com 2019 - 2024. All rights reserved.