PHP:避免除零的优雅方式

时间:2014-06-13 12:48:04

标签: php

就像这个网站一样,我目前的项目有声誉,而且在我正在编写的剧本中,我需要计算两个用户之间的比例'声誉。

$attacker->ratio = $defender->rep / $attacker->rep;
$defender->ratio = $attacker->rep / $defender->rep;

在这样做的过程中,我偶尔可能会将除数的声誉归为0,这很糟糕!

显然我可以添加几张支票,但我想知道是否还没有发明更漂亮的解决方案,比如@这样的问题,但我知道这不是一个好主意。

7 个答案:

答案 0 :(得分:15)

假设正数有效,则确保最低的除数值为1。

$defender->ratio = $attacker->rep / max($defender->rep, 1);

答案 1 :(得分:9)

这就是我的方式。

$defender->ratio = ($defender->rep === 0) ? 0 : $attacker->rep / $defender->rep;

答案 2 :(得分:2)

如果您使用的是PHP> 5.3你可以使用三元运算符?:

$attacker->ratio = $defender->rep / ($attacker->rep ?: 1);
$defender->ratio = $attacker->rep / ($defender->rep ?: 1);

这意味着如果运算符之前的变量为false或为空,则返回之后的值将返回,否则返回第一个值

以下示例:

$attacker->rep = 0;
$defender->rep = 55;
$attacker->ratio = $defender->rep / ($attacker->rep ?: 1); // returns 55 / 1 = 55
$defender->ratio = $attacker->rep / ($defender->rep ?: 1); // returns 0 / 55 = 0

答案 3 :(得分:1)

这样的东西?

if($defender->rep != 0){
    $attacker->ratio = $defender->rep / $attacker->rep;
}

答案 4 :(得分:1)

使用三元运算符检查分频器是否为零。

$attacker->ratio = $attacker->rep > 0 ? $defender->rep / $attacker->rep : 1;
$defender->ratio = $defender->rep > 0 ? $attacker->rep / $defender->rep : 1;

使用您想要的任何内容而不是默认值1

答案 5 :(得分:1)

基于其他答案,我假设你只更新比例,如果它不是零(记住你要求优雅不清晰):

if( !empty($attacker->rep) ) { 
    $attacker->ratio = $defender->rep / $attacker->rep;
}

PHP将0视为空。

答案 6 :(得分:1)

我不建议人为改变任何用户的声誉,仅仅是为了使数学工作。相反,你可以这样做:

function calc_rep_ratio($self, other)
{
    if ($self->rep != 0) {
        return $other->rep / $self->rep;
    } else {
        return NAN;
    }
}

然后使用函数

$defender->ratio = calc_rep_ratio($defender, $attacker);
$attacker->ratio = calc_rep_ratio($attacker, $defender);

在演示文稿中,您可以检查号码

if (is_nan($user->ratio)) {
    echo 'No ratio available';
} else {
    echo $user->ratio;
}