Laravel PHP变量似乎在回声上等同但不在比较声明中

时间:2016-07-18 14:50:17

标签: php laravel-5

所以我被困在一些应该非常简单的事情上,我希望我制作一个简单的语法或类型错误,这是我看不到的,所以我需要一些帮助。

我正在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和我都将类型转换为浮点数,所以我不明白为什么它会抛出中止。

2 个答案:

答案 0 :(得分:2)

也许你的浮点数会使它们在低十进制数字时略有不同。尝试替换

if($calculatedTotalCost != $totalCost)

对某些微小的差异有点容忍,例如:

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

基本思想是,与整数不同,floats可能在算术运算的预期结果上有微小的变化。如果我不得不猜测我会说$calculatedTotalCost经历了一些数学运算并且 完全你所期望的。它与计算机存储价值的方式有关。From the docs

  

永远不会将浮点数结果信任到最后一位数,而不是   直接比较浮点数是否相等

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

答案 1 :(得分:1)

为了调试这类问题,最好使用var_dump而不是echo,因为var_dump将为您提供有关数据类型以及值的信息(如echo所做的那样)。

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

然而,在比较浮点数时存在固有的问题。有关问题和潜在解决方案的讨论,请参阅PHP文档中的this questionthis note