【问题标题】:PHP value comparison wrong despite correct typing [duplicate]尽管输入正确,PHP值比较错误[重复]
【发布时间】:2018-03-30 09:26:31
【问题描述】:

这段代码:

$total=$o->cart->getTotalSum();
$subTotal=$o->cart->getSubTotal();

if(floatval($r['sum_total']) != floatval($total) ||
   floatval($r['sum_sub']) != floatval($subTotal)) {
      echo 'Differs on #' . $r['id'];
      echo 'Total: ' . $total . ' / ' . $r['sum_total'];
      echo 'Sub: ' . $subTotal . ' / ' . $r['sum_sub'];
   }

给我这个输出:

Differs on #697
Total: 19.6 / 19.6
Sub: 19.6 / 19.6

为什么?这怎么可能?

我确保所有比较的值都是浮点类型,所以不会有任何字符串滑入。

我一定是错过了什么。

我很抱歉没有提供真正可重现的代码,但我不知道在这种情况下如何。

【问题讨论】:

    标签: php casting comparison variable-types


    【解决方案1】:

    如果你这样做,它们应该是一样的。但请注意,浮点值的一个特点是计算 看似结果相同的值实际上并不需要完全相同。 因此,如果 $a 是文字 .17 并且 $b 通过计算到达那里 很可能它们是不同的,尽管它们都显示相同 价值。

    通常你永远不会比较浮点值的相等性,比如 对此,您需要使用可接受的最小差异:

    if (abs(($a-$b)/$b) < 0.00001) { echo "same"; } 类似的东西。

    我认为其他人也有同样的问题。

    https://stackoverflow.com/a/3148991/2725502

    【讨论】:

    • 投票关闭重复,不要复制答案。
    • 感谢您向我指出该问题,我在搜索时无法找到适合我的问题的问题。请删除您的答案,以便我可以删除我的问题。鉴于这种情况,它在网络中是无用的
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多