所以我被困在一些应该非常简单的事情上,我希望我制作一个简单的语法或类型错误,这是我看不到的,所以我需要一些帮助。
我正在Laravel中进行表单验证,以确保如果有人通过0
项目的价格从客户端向我发送JSON,那么它将不会向客户收取0
美元的费用但是会使用Laravel的abort()
返回错误。我的问题是,即使客户端totalCost
和calculatedTotalCost
在回显它们时看起来是正确且相同的,我仍然会得到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
和我都将类型转换为浮点数,所以我不明白为什么它会抛出中止。
答案 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 $a
和echo $b
可能会为您提供相同的值,但var_dump($a, $b)
可能会向您显示导致比较失败的差异。
然而,在比较浮点数时存在固有的问题。有关问题和潜在解决方案的讨论,请参阅PHP文档中的this question和this note。