PHP的bcdiv和bcmul函数为何有时计算结果异常,形成长尾词疑问?
- 内容介绍
- 文章标签
- 相关推荐
本文共计521个文字,预计阅读时间需要3分钟。
一、简介我要实现这样一个表达式:z=总奖金 + n=总名额 + i=自己的排名 + (n - i + 1) / (1 + 2 + 3 + ... + n) * z。这是一个分配奖金的公式子。
二、PHP实现及结果差异分析我尝试使用PHP的bc函数进行操作,但发现以下两种写法得到的结果不一致:
1. 使用bcadd和bcdiv函数:phpfunction distributePrize($totalPrize, $totalNominees, $ownRank) { $n=$totalNominees; $i=$ownRank; $sum='0'; for ($j=1; $j <=$n; $j++) { $sum=bcadd($sum, $j); } $result=bcdiv(bcmul(bcsub($n, $i), bcadd('1', $sum)), $sum); return bcadd($totalPrize, $result);}
2. 使用bcpow和bcsqrt函数:phpfunction distributePrize($totalPrize, $totalNominees, $ownRank) { $n=$totalNominees; $i=$ownRank; $sum=bcpow('1', 'n'); $result=bcmul(bcsub($n, $i), bcsqrt(bcadd('1', $sum))); return bcadd($totalPrize, $result);}
这两种写法的结果不一致,原因在于bcpow和bcsqrt函数在计算过程中引入了误差。正确的写法应该是使用bcadd和bcdiv函数。
一、简介
我要实现这样一个表达式
z=总奖金
n=总名数
i=自己的排民
((n-i+1)/(1+2+3+…n))*z
这是一个分配奖金的式子。我试着用php的bc函数进行操作发现以下两种写法得出不一样的结果
表达式1: a r r [ arr[ arr[i]=bcmul(bcdiv((51- i ) , i), i),num,2), r e w a r d [ ′ L e a d e r b o a r d ′ ] , 0 ) ; 表 达 式 2 : reward['Leaderboard'],0); 表达式2: reward[′Leaderboard′],0);表达式2:arr[ i ] = b c m u l ( b c d i v ( i]=bcmul(bcdiv( i]=bcmul(bcdiv(reward[‘Leaderboard'], n u m , 2 ) , ( 51 − num,2),(51- num,2),(51−i),0);
二、现象
1.我代码
//根据时间计算排名奖励 public function calculateTheReward($dateStr="2021-04-12 00:00:00"){ $reward=Login::table('dailyReward')->where(['dateStr'=>$dateStr])->find()->toArray(); $arr=[]; $num=1275; for ($i=1;$i<=50;$i++){ $arr[$i]=bcmul(bcdiv($reward['Leaderboard'],$num,2),(51-$i),0);//bcmul(bcdiv((51-$i),$num,2),$reward['Leaderboard'],0); } print_r($arr);die; }
用表达式1得出结果:
用表达式2得出以下结果:
到此这篇关于php bcdiv和bcmul 函数的怪异现象的文章就介绍到这了,更多相关php bcdiv和bcmul 函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计521个文字,预计阅读时间需要3分钟。
一、简介我要实现这样一个表达式:z=总奖金 + n=总名额 + i=自己的排名 + (n - i + 1) / (1 + 2 + 3 + ... + n) * z。这是一个分配奖金的公式子。
二、PHP实现及结果差异分析我尝试使用PHP的bc函数进行操作,但发现以下两种写法得到的结果不一致:
1. 使用bcadd和bcdiv函数:phpfunction distributePrize($totalPrize, $totalNominees, $ownRank) { $n=$totalNominees; $i=$ownRank; $sum='0'; for ($j=1; $j <=$n; $j++) { $sum=bcadd($sum, $j); } $result=bcdiv(bcmul(bcsub($n, $i), bcadd('1', $sum)), $sum); return bcadd($totalPrize, $result);}
2. 使用bcpow和bcsqrt函数:phpfunction distributePrize($totalPrize, $totalNominees, $ownRank) { $n=$totalNominees; $i=$ownRank; $sum=bcpow('1', 'n'); $result=bcmul(bcsub($n, $i), bcsqrt(bcadd('1', $sum))); return bcadd($totalPrize, $result);}
这两种写法的结果不一致,原因在于bcpow和bcsqrt函数在计算过程中引入了误差。正确的写法应该是使用bcadd和bcdiv函数。
一、简介
我要实现这样一个表达式
z=总奖金
n=总名数
i=自己的排民
((n-i+1)/(1+2+3+…n))*z
这是一个分配奖金的式子。我试着用php的bc函数进行操作发现以下两种写法得出不一样的结果
表达式1: a r r [ arr[ arr[i]=bcmul(bcdiv((51- i ) , i), i),num,2), r e w a r d [ ′ L e a d e r b o a r d ′ ] , 0 ) ; 表 达 式 2 : reward['Leaderboard'],0); 表达式2: reward[′Leaderboard′],0);表达式2:arr[ i ] = b c m u l ( b c d i v ( i]=bcmul(bcdiv( i]=bcmul(bcdiv(reward[‘Leaderboard'], n u m , 2 ) , ( 51 − num,2),(51- num,2),(51−i),0);
二、现象
1.我代码
//根据时间计算排名奖励 public function calculateTheReward($dateStr="2021-04-12 00:00:00"){ $reward=Login::table('dailyReward')->where(['dateStr'=>$dateStr])->find()->toArray(); $arr=[]; $num=1275; for ($i=1;$i<=50;$i++){ $arr[$i]=bcmul(bcdiv($reward['Leaderboard'],$num,2),(51-$i),0);//bcmul(bcdiv((51-$i),$num,2),$reward['Leaderboard'],0); } print_r($arr);die; }
用表达式1得出结果:
用表达式2得出以下结果:
到此这篇关于php bcdiv和bcmul 函数的怪异现象的文章就介绍到这了,更多相关php bcdiv和bcmul 函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

