如何检查两个值之间的变化(百分比)?

时间:2015-06-18 22:23:16

标签: python math

我有两个值(先前和当前),我想检查它们之间的变化(百分比):

(current/previous)*100

但如果前一个值为0,我会得到除零,如果值不会改变,我得到100%。

6 个答案:

答案 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

请注意,如果previous0,则无法计算百分比的变化(无论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

这是我发现的更好的方法。