为什么我在这里得到零误差?

时间:2015-07-01 17:45:57

标签: php

我在这行代码中得到零错误除法:

$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;

我用以下方法测试了上述内容:

echo '$ratio[{W}]:'.$ratio['{W}'].', $colorTotal:'.$colorTotal;

if($ratio['{W}'] === 0) {
    echo('$ratio[{W}]: zero');
}
else {
    echo('$ratio[{W}]: not zero');
}

if($colorTotal === 0) {
    echo('$colorTotal: zero');
}
else {
    echo('$colorTotal: not zero');
}

结果是:

[01-Jul-2015 17:40:26 UTC] $ratio[{W}]:0, $colorTotal:0

[01-Jul-2015 17:40:26 UTC] $ratio[{W}]: zero

[01-Jul-2015 17:40:26 UTC] $colorTotal: zero

似乎我永远不应该在代码中达到这一点($ratio['{W}'] / $colorTotal),因为先前的标准在检查中为0但似乎达到了它?如何防止此错误?

3 个答案:

答案 0 :(得分:3)

三元运算符在PHP中是左关联的。您的代码相当于:

$ratio['p{W}'] = (($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0)) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;

意思是($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0) 首先评估。结果是0true,这意味着第二个三元组的真实部分将始终执行。

在我看来,你可能想让整个表达成为正确联想:

$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : (($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100);

答案 1 :(得分:0)

我开始在你的三元组周围添加括号,因为我担心ElGavilan是对的。 您的单行内容非常难看,并且指的是我们没有的代码,这意味着我们无法测试您的代码。

我喜欢三元组......但不是那样!

答案 2 :(得分:0)

$ratio['p{W}'] = ($ratio['{W}'] === 0) ? 0 : ($colorTotal === 0) ? 0 : ($ratio['{W}'] / $colorTotal) * 100;

($ratio['{W}'] === 0)表示$ratio['{W}']为假,然后在两种情况下执行错误代码($colorTotal === 0) ($ratio['{W}'] === 0) & ($colorTotal === 0)值变为0.对于最后一个案例分割案例0/0。 / p>