Вы должны разделить по абсолютному значению предыдущего числа. Если предыдущее число отрицательное и текущее число отрицательное, вы получите ошибочный результат, если вы не используете абсолютное значение в знаменателе. Например, если текущий номер -6 и предыдущий номер -5:
(-6 - (-5))/-5 =
(-6 + 5)/-5 =
-1/-5 = 20 %
, который явно ложный, поскольку процентное изменение в этом случае должно быть отрицательным -6 < -5
. Поэтому используйте функцию ниже:
def percentage_change(current, previous):
if previous != 0 :
return float(current - previous)/abs(previous) * 100
else:
return "undefined"
Имейте в виду, что если ваше предыдущее число равно нулю, деление на ноль не определено: https://en.wikipedia.org/wiki/Division_by_zero
Также вы не должны использовать абсолютное значение числителе вместо знаменателя , Ниже приведен пример, почему:
предыдущее значение: -5
текущее значение: -4
| (-4 - (-5)) |/-5 =
| (-4 + 5) |/-5 =
|1|/-5 =
1/-5 = -20%
, который является ложным, поскольку -4 > -5
Правильно:
(-4 - (-5))/| -5 | =
(-4 + 5)/| -5 | =
1/5 = 20%
Если предыдущее значение равно нулю, а текущее значение отличное от нуля, тогда вы не можете означать рассчитывать изменение в пропорции к старому значению; это общий математический принцип, который не имеет ничего общего с программированием. – Hammerite
Если вы хотите, чтобы процент изменения («X% больше»), а не абсолютное сравнение («текущий - X% от предыдущего»), вам нужно сделать '(текущий/предыдущий) * 100 - 100'. Конечно, это все равно не позволит вам делить на ноль. – TigerhawkT3
если 'текущий == предыдущий' не указывает на 0% -ное изменение, а не на 100%? Если он изменяется от 100 до 80, это 20% или 80% в вашем случае использования? – mehtunguh