【问题标题】:Comparing 2 Same Decimal Numbers But Gives Wrong Result比较 2 个相同的十进制数但给出错误的结果
【发布时间】:2018-06-05 13:43:39
【问题描述】:

如果条件我有这个:

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 仍然被识别为不同的东西?

【问题讨论】:

  • 相关阅读过here
  • 实数小数点后没有尾随零。因此,如果输出一个未格式化的“数字”给你0.60533000,那么你没有一个实际的数字值开始,而是一个字符串。
  • “为什么 PHP 认为 0.60533000 与 0.60533 不同” -- 它们是数字还是字符串?

标签: php


【解决方案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;
}

【讨论】:

  • 我试过你的解决方案,兄弟。但仍然给我同样的结果。
  • 那是因为这不是解决方案。您正在尝试比较小数字(很可能在加密货币交易应用程序中),因此只需使用字符串作为 number_format
  • @SaintRobson 但它的工作原理是基于您提供给我们的代码和数字? 3v4l.org/LAZ0b
  • 这是一个糟糕的解决方案,因为他将它与加密一起使用。由于浮点精度的限制,最好只保留字符串,避免将(float) 转换为变量。
  • 是的,但是我对加密一无所知,这不是问题所在。赞成您的答案,因为它清晰简洁,但是根据问题为我提供的内容,这并没有使我的回答变差。
【解决方案2】:

在比较之前格式化数字。

$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 来正确比较它们。

【讨论】:

  • 这似乎有效,即使是字符串:3v4l.org/XPOHl。需要指出的是,没有“松散”打字这样的东西。它要么是静态的/动态的,要么是弱的/强的。
  • @Loek 固定为“弱”。我错误地指的是比较。
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多