简体   繁体   English

如何优化分数计算功能?

[英]How optimize function of counting fractions?

I write function which gets one array from 3 elements (integer, numerator and denominator). 我编写了一个从3个元素(整数,分子和分母)中获取一个数组的函数。 It calculate wrong fractions to normal (numerator>denominator). 它计算出错误的分数到正常值(分子>分母)。

How optimize this function? 如何优化此功能? I understand that I make many verification, but function looks ugly. 我知道我进行了很多验证,但是功能看起来很丑。

function calculate_measurement(array $m): array
        {
            if (isset($m[NUMERATOR]) && isset($m[DENOMINATOR])) {
                while (intval($m[NUMERATOR]) >= intval($m[DENOMINATOR])) {
                    $m[NUMERATOR] -= $m[DENOMINATOR];
                    if (!isset($m[INTEGER])) {
                        $m[INTEGER] = 0;
                    }
                    ++$m[INTEGER];
                }

                if (0 === $m[NUMERATOR]) {
                    $m[NUMERATOR] = null;
                    $m[DENOMINATOR] = null;
                }
            }

            return $m;
        }

At least, you can rewrite the function like this: 至少,您可以这样重写函数:

function calculate_measurement(array $m): array
{
   if (!isset($m[INTEGER])) {
            $m[INTEGER] = 0;
   }
   if (!isset($m[NUMERATOR]) || !isset($m[DENOMINATOR])) {
            return $m;
   }
   while (intval($m[NUMERATOR]) >= intval($m[DENOMINATOR])) {
             $m[NUMERATOR] -= $m[DENOMINATOR];
             ++$m[INTEGER];
   }  
   if (0 === $m[NUMERATOR]) {
          $m[NUMERATOR] = null;
          $m[DENOMINATOR] = null;
   }
   return $m;
}

I do not understand the intval() use. 我不了解intval()的用法。 Can be numerator/denominator non-integers? 分子/分母可以不是整数吗? I would rather see functions like this: 我宁愿看到这样的功能:

function calculate_measurement(int $i, int $numerator, int $denominator) : array
{
     while($numerator >= $denominator) {
         $numerator -= $denominator;
         ++$i;
     }
     if(0 === $numerator) {
          $numerator = $denominator = null;
     }
     return [
           INTEGER => $i,
           NUMERATOR => $numerator,
           DENOMINATOR => $denominator
     ];
}

function calculate_measuremenet_arr(array $m): array
{
     if (!isset($m[NUMERATOR]) || !isset($m[DENOMINATOR])) {
        return $m;
     }
     return calculate_measurement(
              $m[INTEGER] ?? 0,
              intval($m[NUMERATOR]),
              intval($m[DENOMINATOR])
     );
}

A loop isn't necessary, just calculate the integer and the new numerator. 不需要循环,只需计算整数和新的分子即可。 Something like this should do it: 这样的事情应该做到:

function calculate_measurement(array $m): array {
    if (!isset($m[NUMERATOR]) || !isset($m[DENOMINATOR])) {
        return $m;
    }

    $m[INTEGER] = intval($m[NUMERATOR] / $m[DENOMINATOR]);
    $m[NUMERATOR] -= ($m[INTEGER] * $m[DENOMINATOR]);

    if ($m[NUMERATOR] === 0) {
        $m[NUMERATOR] = null;
        $m[DENOMINATOR] = null; 
    }

    return $m;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM