PHP:数据库扩展-避免被零除

ljo96ir5  于 2023-01-29  发布在  PHP
关注(0)|答案(8)|浏览(118)

很像这个网站,我目前的项目有声誉和脚本,我的工作,我需要计算两个用户的声誉之间的比率。

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

在这样做的时候,我可能偶尔会以除数的声誉为0而告终,这太糟糕了!
显然,我可以添加几个检查,但我想知道是否还没有发明一个更漂亮的解决方案,像@前面的东西,但我知道这不是一个好主意。

qcuzuvrc

qcuzuvrc1#

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

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

//― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ―
别人建议的代码
@php_nub_qq建议的替代代码...
在今天的PHP中

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

唉,@php_nub_qq提供的这段代码在PHP 7. 4中不起作用;- (见评论中的@OceanBt ......感谢他们的纠正!:)
所以,在这里我维护的代码,我从来没有感兴趣。现在,显示为PHP版本特定!这里是更正...

$y = 100/($x ?: 1);

我为什么要这么做?
1.注意我的代码仍然工作正常!避免在生产代码中使用"聪明的特性"。
1.因为有些人认为有一个"更好的答案"并不意味着他们这样做!
我不介意做这个维护别人的代码!这是现实世界!我们必须这样做。我发布它是因为:
我真的在努力帮助程序员学习。
//我对我发布的内容的"改进"的想法...
imo,你的建议和我的方法不一样!我特别使用了'max',因为它强制限制了一个数字的范围。你可以嵌套'min'和'max'函数来强制限制范围。
你的方法是一种"选择",而不是我为什么要做我做的答案

ugmeyewa

ugmeyewa2#

我会这么做。

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

oyt4ldly3#

如果您使用的是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
inn6fuwd

inn6fuwd4#

像这样?

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

lhcgjxsq5#

使用三元运算符检查除数是否为零。

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

使用任何您想要的值代替默认值1

pxq42qpu

pxq42qpu6#

根据其他答案,我假设您只在比率不为零时才更新比率(请记住,您要求的是优雅而不是清晰):

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

PHP将0视为空。

htzpubme

htzpubme7#

我不建议你仅仅为了计算结果而人为地改变用户的声誉,相反,你可以这样做:

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;
}
e4eetjau

e4eetjau8#

要防止出现错误消息,请尝试

try {
    return $a/$b;
  } catch (DivisionByZeroError $e) {
    echo 'Error DivisionByZeroErro';
  }

相关问题