Laravel PHP变量在Echo中看起来相等,但在比较语句中却不相等


Laravel PHP Variables Appear To Be Equal On Echo But Not in Comparison Statement

所以我一直在做一些应该很容易的事情,我希望我犯了一个我看不到的简单语法或类型错误,所以我需要一些帮助。

我在Laravel中进行表单验证,以确保如果有人从客户端向我发送带有商品价格为0的JSON,它不会向客户收取0美元,而是会使用Laravel的abort()返回错误。我的问题是,即使客户端totalCostcalculatedTotalCost在回显时看起来是正确和相同的,我仍然得到abort()

我的部分代码如下:

$totalCost= str_replace("$","",$totalCost);
$totalCost = (float)$totalCost;
if($calculatedTotalCost != $totalCost){
            abort(500, 'Your Order Cost Is Incorrect!'.$calculatedTotalCost." ".$totalCost);
            return;
           }

事情正在中止,我的回答是:

Your Order Cost Is Incorrect!46.45 46.45

就这样,46.45和我都将类型转换为浮点,所以我不明白它为什么会抛出中止。

也许您的浮点值在小数位数较低时略有不同。尝试更换

if($calculatedTotalCost != $totalCost)

有了一些对微小差异更宽容的东西,比如:

if(abs($calculatedTotalCost - $totalCost) > 0.001)

其基本思想是,与整数不同,floats在算术运算的预期结果方面可能有微小的变化。如果非要我猜的话,我会说$calculatedTotalCost已经经历了一些数学运算,并不是你所期望的那样。这与计算机如何存储值有关。来自文档:

永远不要将浮点数结果信任到最后一位,也不要直接比较浮点数以获得相等

更安全的方法是测量值之间的差异是否在可接受的范围内。

对于调试这类问题,最好使用var_dump而不是echo,因为var_dmp会为您提供有关数据类型以及值的信息(就像echo一样)。

例如。echo $aecho $b可能会给您相同的值,但var_dump($a, $b)可能会向您显示导致比较失败的差异。

然而,在比较浮点数时存在固有的问题。例如,请参阅PHP文档中的这个问题和这个注释,以了解有关该问题和潜在解决方案的讨论。