比较2个相同的十进制数但给出错误的结果

时间:2018-06-05 13:43:40

标签: php

我有这个条件:

if ($dc_real_vol != $dc_sum_vol) {
    echo '||+++ REAL VOL ' . $dc_real_vol . PHP_EOL;
    echo '||+++ SUM VOL ' . $dc_sum_vol . PHP_EOL;
    echo '||+++ THIS TRADE IS DAMAGE ' . PHP_EOL;
}

当我检查输出时:

||+++ REAL VOL 0.60533000
||+++ SUM VOL 0.60533
||+++ THIS TRADE IS DAMAGE 

为什么PHP认为0.605330000.60533不同?如何使这个条件标记为真?

更新:

我从下面的Loek尝试了解决方案,我改变了我的代码:

$dc_real_vol = (float) $dc_real_vol;
$dc_sum_vol = (float) $dc_sum_vol;

echo '||*** REAL VOL ' . $dc_real_vol . PHP_EOL;
echo '||*** SUM VOL ' . $dc_sum_vol . PHP_EOL;

if ($dc_real_vol !== $dc_sum_vol) {

    var_dump($dc_real_vol);
    var_dump($dc_sum_vol);

    echo '||+++ THIS TRADE IS DAMAGE ' . PHP_EOL;
}

以及结果:

||*** REAL VOL 0.60533
||*** SUM VOL 0.60533
float(0.60533)
float(0.60533)
||+++ THIS TRADE IS DAMAGE 

为什么相同的数字,相同的类型,但PHP仍然被认为是不同的东西?

2 个答案:

答案 0 :(得分:1)

我无法解释为什么PHP认为数字不同,我只知道它们在字节级别实际上 不同。

我能想到的最简单的方法是将两个数字都转换为浮点数,然后像往常一样继续:https://3v4l.org/uQdAP

// Note we can even use !== instead of != now
if ((float) $dc_real_vol !== (float) $dc_sum_vol) {
    echo '||+++ REAL VOL ' . $dc_real_vol . PHP_EOL;
    echo '||+++ SUM VOL ' . $dc_sum_vol . PHP_EOL;
    echo '||+++ THIS TRADE IS DAMAGE ' . PHP_EOL;
}

答案 1 :(得分:1)

在比较之前格式化数字。

$dc_real_vol = number_format($dc_real_vol, 9);
$dc_sum_vol = number_format($dc_sum_vol, 9);

您的比较无效的实际原因是您最有可能将这些变量指定为strings。 PHP打字很弱。您可以在与var_dump进行比较之前检查变量来验证这一点。很可能PHP会报告它已将变量键入为字符串。在这种情况下,您应该使用number_format来正确比较它们。