Расчет процентных изменений без деления на ноль - PullRequest
2 голосов
/ 22 января 2012

У меня есть следующий PHP, который я использую для вычисления процентного уменьшения или увеличения:

function CalculatePercentageIncrease( $nLastMonthPeriod, $nCurrentPeriod ) {
    if ( !is_numeric( $nLastMonthPeriod ) || !is_numeric( $nCurrentPeriod ) )
        return 0;

    if ( $nLastMonthPeriod == 0 )
        return 0;

    $nLastMonthPeriod = intval( $nLastMonthPeriod );
    $nCurrentPeriod = intval( $nCurrentPeriod );

    $nDifference = ( ( ( $nCurrentPeriod - $nLastMonthPeriod ) / $nLastMonthPeriod ) * 100 );

    return round( $nDifference );
}

Проблема, которая меня интересует, заключается в том, что если $nLastMonthPeriod равно 0, а $nCurrentPeriod равно 10, тоон должен возвращать 100, а не 0?

Ответы [ 5 ]

8 голосов
/ 22 января 2012

Увеличение от 0 до 10 не может быть описано как процентное увеличение.Вы должны рассматривать этот случай отдельно.

Ответ не 0% или 100%.

Либо

  1. сообщить пользователям функции, чтоон действителен только в том случае, если старое значение равно! = 0

  2. использовать исключения

  3. вернуть NULL (предложено Джеком Мани)

2 голосов
/ 22 января 2012

Поскольку вы не можете делить на ноль (по многим причинам, как техническим, так и обыденным), вероятно, было бы лучше вернуть NULL, когда $nLastMonthPeriod==0.

2 голосов
/ 22 января 2012

, если $ nLastMonthPeriod равен 0 , а $ nCurrentPeriod равен 10, тогда должно быть , возвращая 100, а не 0 ?

Это то, что вы закодировали ...

  if ( $nLastMonthPeriod == 0 )
        return 0;

Вы имели в виду?

  if ( $nLastMonthPeriod == 0 )
       if ($nCurrentPeriod>0)
          return 100; //whatever you want
       else
          return 0;
0 голосов
/ 30 января 2013
function percent($small, $large){
    if($large !=0){
    $percentCalc = ((100*$small)/$large);
    $percent = number_format($percentCalc, 1);
        return $percent;
    } else {
    return '0';
}
}
0 голосов
/ 22 января 2012

Вы можете просто поставить чек:

$nDifference = $nLastMonthPeriod == 0 ? 100 : ( ( ( $nCurrentPeriod - $nLastMonthPeriod ) / $nLastMonthPeriod ) * 100 );
...