【问题标题】:How to calculate percentages [closed]如何计算百分比[关闭]
【发布时间】:2013-07-28 18:20:10
【问题描述】:

我的数学真的很差,我无法计算以下内容.. 我有两列名为 experiencelevel

如果 experience 超过 200,则 level 将更新为 1

如果 experience 超过 500,则 level 将更新为 2

.... 我的意思是我从未重置experience

所以,我有一个加载条图像,我必须计算以百分比表示的时间。我试过这样的东西

function lvlbar($xp, $level){

if($level == 0)
    {

         $percent = @round(($xp / 200)*100);

   }

    elseif($level == 1){

$percent = @round(($xp / 500)*100);

    }

    elseif($level == 2){

    $percent = @round(($xp / 900)*100);
} 

    elseif($level == 3){
    $percent = @round(($xp / 1400)*100);
} 

    elseif($level == 4){
    $percent = @round(($xp / 1900)*100);
} 

    elseif($level == 5){
    $percent = @round(($xp / 2500)*100);
} 

    elseif($level == 6){
    $percent = @round(($xp / 3200)*100);
} 

    elseif($level == 7){
    $percent = @round(($xp / 4000)*100);
} 

    elseif($level == 8){
    $percent = @round(($xp / 4900)*100);
} 

    elseif($level == 9){
    $percent = @round(($xp / 5800)*100);
} 

    elseif($level == 10){
    $percent = @round(($xp / 6800)*100);
}

return $percent;

}

当您低于1 级别时它工作正常,但是一旦您达到级别2 计算就会出错并且百分比从50、60 等开始...... 我想这是我的公式。帮帮我

【问题讨论】:

  • 加载栏在 100% 时的宽度是多少?
  • 图片没问题。但问题是,如果我处于第 3 级并且我有900 experience,则百分比必须为 0%,但公式给了我 64%。我不明白。
  • 在您的问题不包含任何演示该问题的工作示例的问题旁边(这是一个必须 在 SO 上),您有格式问题,并且您使用了 @ 错误抑制运算符,这不应该在 SO 上的 PHP 示例代码中完成。请让自己对格式化工具感到满意,并编辑您的问题以改进它。
  • 与您对问题的具体需求相比,问题标题也过于宽泛。您不是在问这通常在数学中是如何完成的(计算百分比),而是在要求获得代码转储的调试帮助。

标签: php math formula percentage


【解决方案1】:

您的概念看起来不错,但有一个小错误。经验栏需要为每个级别重置。例如,当经验为 350 时,您要显示 50%。

也就是说,你的公式是:

下一级的百分比 = 当前级别的经验 / 升级到下一级所需的经验

再举个例子:

经验为 350 = (350 - 200) / (500 - 200) = 50% 时达到 2 级的百分比

【讨论】:

  • 谢谢!这解决了问题:)
【解决方案2】:

我不完全明白这个问题,所以不能提出一个确切的解决方案。但那肯定是乱七八糟的重复代码!我认为你要除以的那个数字在同一时间水平上增加会更好。所以在不知道你在做什么的情况下,比如:

function goUpLevel(){
  $level++;
  $experienceMax = $level * $experienceLevelMultiplier;
}

然后您发布的功能会更简单,例如:

function lvlbar($xp, $level){
$percent = @round(($xp / $experienceMax)*100);
}

如果您无法计算出 $experienceLevelMultiplier 的乘数,那么可能是每个级别的值数组,即

$experienceLevelMultiplierArray = array (
1 => 10
2 => 15.5
);

这看起来更好,可扩展性更好,并且更易于管理和理解!如果您描述一下问题的背景,我一定可以提供进一步的帮助!

免责声明:我很久没有做PHP了,所以请忽略任何错误。我是在交流一个想法,而不是一个确切的解决方案。

【讨论】:

    【解决方案3】:

    这几乎是我会做的。正如之前的海报所提到的,你必须在升级时调整 xp。

    function lvlbar($xp, $level){
      $levels = array(
          0 => 200,
          1 => 500,
          2 => 900,
          3 => 1400,
          4 => 1900,
          5 => 2500,
          6 => 3200,
          7 => 4000,
          8 => 4900,
          9 => 5800,
          10 => 6800
      );
      if (array_key_exists($level, $levels)) {
        $lastlevelXp = !empty($levels[$level-1]) ? $levels[$level-1] : 0;
        $adjustedXp = $xp - $lastlevelXp;
        $adjustedLevelMax = $levels[$level] - $lastlevelXp;
        $percent = round(($adjustedXp / $adjustedLevelMax)*100);
      }
      return !empty($percent) ? $percent : 0;
    }
    

    示例输出:

    Level 0 with 95xp:   48%
    Level 1 with 370xp:  57%
    Level 2 with 640xp:  35%
    Level 3 with 1150xp: 50%
    Level 4 with 1405xp: 1%
    Level 5 with 2400xp: 83%
    Level 6 with 3180xp: 97%
    Level 7 with 3999xp: 100%
    

    【讨论】:

      【解决方案4】:

      如果您的问题处于第 3 级,请查看您的数学是否符合该条件:

      elseif($level == 3){
          $percent = @round(($xp / 1400)*100);
      }
      

      如果如您所说,$xp = 900,请使用计算器并将其除以 1400,如上述计算所示。

      然后将结果乘以 100,四舍五入的结果为 64%,因此数学返回正确,只是方程式错误。

      【讨论】:

        【解决方案5】:

        如果您希望百分比条回到 0(不包括条中的先前经验),您需要减去先前级别的数量。

        另外,我建议为此使用 switch()。

        试试这个:

        function lvlbar($xp, $level){
          switch($level) {
            case 0:
              $percent = @round(($xp / 200)*100);
            case 1:
              $percent = @round((($xp - 200) / 500)*100);
            case 2:
              $percent = @round((($xp - 500) / 900)*100);
            case 3:
              $percent = @round((($xp - 900) / 1400)*100);
            case 4:
              $percent = @round((($xp - 1400) / 1900)*100);
            case 5:
              $percent = @round((($xp - 1900) / 2500)*100);
            case 6:
              $percent = @round((($xp - 2500) / 3200)*100);
            case 7:
              $percent = @round((($xp - 3200) / 4000)*100);
            case 8:
              $percent = @round((($xp - 4000) / 4900)*100);
            case 9:
              $percent = @round((($xp - 4900) / 5800)*100);
            case 10:
              $percent = @round((($xp - 5800) / 6800)*100);
          }
          return $percent;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          • 2021-04-12
          • 1970-01-01
          • 2020-09-23
          • 1970-01-01
          相关资源
          最近更新 更多