【问题标题】:Is there an operator to calculate percentage in Python?Python中有计算百分比的运算符吗?
【发布时间】:2022-05-14 17:34:33
【问题描述】:

我最近了解到“%”符号用于在 Python 中计算整数的余数。但是我无法确定 Python 中是否还有其他运算符或方法来计算百分比。

就像用“/”给你的商一样,如果你只是对其中一个整数使用浮点数,它实际上会给你像传统除法一样的答案。那么有没有办法算出百分比呢?

【问题讨论】:

  • 明确一点,您是指x * y / 100.0 还是(x/y) * 100.0?我们大多数人把它理解为乘法。布赖恩把它读作除法。

标签: python python-3.x


【解决方案1】:

您可以将两个数字相除并乘以 100。请注意,如果“整数”为 0,这将引发错误,因为询问一个数字占 0 的百分比是没有意义的:

def percentage(part, whole):
  return 100 * float(part)/float(whole)

或者在结尾加一个 %:

 def percentage(part, whole):
  Percentage = 100 * float(part)/float(whole)
  return str(Percentage) + “%”

或者,如果您希望它回答的问题是“20 的 5% 是多少”,而不是“20 的 5 是多少”(受Carl Smith's answer 启发的问题的不同解释),您可以写:

def percentage(percent, whole):
  return (percent * whole) / 100.0

【讨论】:

  • 您可能需要添加一个 if whole is 0 return 0,否则这将引发异常。我刚遇到这个,所以我要让你知道!
  • @CarlSmith 我没有复制你的答案;你会注意到我的版本和你的不一样。后半部分受到您对问题的不同解释的启发,所以您是对的,我应该感谢您启发我添加对问题的替代解释。
  • @CarlSmith 如果您注意到,我们的两个答案之间存在功能差异,如果您都尝试一下,您可以看到:percentage(5, 20)(我的版本)给您1.0,占 5% 20 的值为 1,而 percent(5, 20)(您的版本)为您提供 0.0,这是不正确的,因为您使用地板除法。
  • 好的 - 不用担心。我只是注意到您的编辑使我的答案变得多余,但并不是真正可删除的。我已经在这里和下面删除了我原来的 cmets 来整理一下。如果你也想这样做?
  • 你不需要2个演员,你可以简单地写return 100.0 * part/whole
【解决方案2】:

Python 中没有这样的运算符,但你自己实现它是微不足道的。在计算的实践中,百分比几乎没有模数那么有用,所以我能想到的语言都没有实现它。

【讨论】:

  • 我要补充一点,即使在数学中,比率也比百分比有用得多。百分比只是表示更多人熟悉的比率的一种方式。
  • @nim6us:如果您只需要打印百分比,那么 Python 字符串格式有这样的指令:"{:.1%}".format(0.1234) -> '12.3%'
  • @jfs 这句话太好了,IMO 值得单独回答。
  • 为什么这个答案被接受了? Brian Campbell 的回答实际上给出了一些代码。
【解决方案3】:

% 的使用

def percent(expression="1000*12%") -> float:
    if "%" in expression:
        expression = expression.replace("%","")
        a, b = expression.split("*")
        a, b = float(a), float(b)
    return a*b/100

>>> percent("1500*20%")
300.0

另一种方式

p = lambda x : x/100
p20 = p(20)

>>> 150*p20
30.0

【讨论】:

    【解决方案4】:

    Brian 的答案(自定义函数)通常是正确且最简单的做法。

    但如果您真的想用(非标准)'%' 运算符定义数字类型,就像台式计算器那样,那么 'X % Y' 表示 X * Y / 100.0 , 然后从 Python 2.6 开始你可以重新定义the mod() operator:

    import numbers
    
    class MyNumberClasswithPct(numbers.Real):
        def __mod__(self,other):
            """Override the builtin % to give X * Y / 100.0 """
            return (self * other)/ 100.0
        # Gotta define the other 21 numeric methods...
        def __mul__(self,other):
            return self * other # ... which should invoke other.__rmul__(self)
        #...
    

    如果您曾经在 MyNumberClasswithPct 与普通整数或浮点数的混合中使用“%”运算符,这可能会很危险。

    这段代码的另一个乏味之处在于您还必须定义 Integral 或 Real 的所有 21 种其他方法,以避免在实例化它时出现以下烦人且晦涩的 TypeError

    ("Can't instantiate abstract class MyNumberClasswithPct with abstract methods __abs__,  __add__, __div__, __eq__, __float__, __floordiv__, __le__, __lt__, __mul__,  __neg__, __pos__, __pow__, __radd__, __rdiv__, __rfloordiv__, __rmod__, __rmul__,  __rpow__, __rtruediv__, __truediv__, __trunc__")
    

    【讨论】:

    • 这里真正高级的东西虽然在这种情况下不是一个好主意,但显示了 Python 类型的真正力量!
    • 我喜欢 python 的原因,这个。此外,是否可以通过克隆现有的 int 类型并设置 __mod____mul__ 运算符来做一些魔术来重新定义所有抽象方法,然后分配它成为 MyNumberClasswithPct ?
    • 我这样做神会生气的
    • 像这样吗?:gist.github.com/thorsummoner/135c6a3c9b02b63c2e79 我最初扩展了 numbers.Real 和 int,但我意识到我只需要扩展 float。
    • @ThorSummoner 是的,但为了安全起见,我专门从抽象基类 numbers.Real 而不是 float 继承。在您的 Percent 对象上尝试其他运算符,看看您是否没有任何矛盾?也许使用numbers.Real 太偏执了。
    【解决方案5】:

    使用 lambda 运算符非常快速且有序地编写代码实现。

    In [17]: percent = lambda part, whole:float(whole) / 100 * float(part)
    In [18]: percent(5,400)
    Out[18]: 20.0
    In [19]: percent(5,435)
    Out[19]: 21.75
    

    【讨论】:

    • 但是.....这不起作用。 5/400 * 100 = 1.25%,而不是 20%
    • @ChrisS 这实际上是“400 的 5% 是多少?”而不是“400 中的 5 的百分比是多少?”
    【解决方案6】:
    def percent(part, whole):
        try:
            return 100 * float(part) / float(whole)
        except ZeroDivisionError:
            return 0
    

    【讨论】:

    • 嗨派瓦图里奥!感谢您提供您的答案,但将来请尽量避免“仅代码”的答案,并在您的代码 sn-ps 周围添加一些解释,请参阅How to Answer。谢谢!
    【解决方案7】:

    我发现对我来说最有用的情况是将计算结果计算为比率,然后使用 Python formatting options 将结果格式化为百分比:

    result = 1.0/2.0            # result is 0.5
    print(f'{result:.0%}')      # prints "50%"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多