我有两个值(先前和当前),我想检查它们之间的变化(百分比):
(current/previous)*100
但如果前一个值为0,我会得到除零,如果值不会改变,我得到100%。
答案 0 :(得分:12)
def get_change(current, previous):
if current == previous:
return 100.0
try:
return (abs(current - previous) / previous) * 100.0
except ZeroDivisionError:
return 0
编辑:有人评论说OP正在描述当前代码的问题,而不是要求这种行为,因此这里有一个例子,“如果当前等于先前,则没有变化。你应该返回0 ”。此外,如果前一个值为0,我已使该方法返回Infinity,因为当原始值为0时,不会有真正的百分比变化。
def get_change(current, previous):
if current == previous:
return 0
try:
return (abs(current - previous) / previous) * 100.0
except ZeroDivisionError:
return float('inf')
答案 1 :(得分:5)
您需要将更改(current-previous
)除以previous
,而不仅仅是当前。所以,简而言之:
change_percent = ((float(current)-previous)/previous)*100
请注意,如果previous
为0
,则无法计算百分比的变化(无论python实现如何)
答案 2 :(得分:2)
要涵盖所有零的情况,您可以在语句中使用三元运算符
(current - previous) / previous * 100.0 if previous != 0 else float("inf") * abs(current) / current if current != 0 else 0.0
答案 3 :(得分:1)
您应该除以前一个数字的绝对值。 如果前一个数字为负数且当前数字为负数,则如果不使用分母中的绝对值,则会得到错误的结果。 例如,如果您当前的数字是-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%
答案 4 :(得分:0)
我用这个
def pct_change(first, second):
diff = second - first
change = 0
try:
if diff > 0:
change = (diff / first) * 100
elif diff < 0:
diff = first - second
change = -((diff / first) * 100)
except ZeroDivisionError:
return float('inf')
return change
答案 5 :(得分:0)
def get_percentage_diff(previous, current):
try:
percentage = abs(previous - current)/max(previous, current) * 100
except ZeroDivisionError:
percentage = float('inf')
return percentage
这是我发现的更好的方法。