2011-05-13 725 views
26

我最近了解到,「%」符號用於計算Python中整數的其餘部分。但是我無法確定是否有另一個運算符或方法來計算Python中的百分比。就像「/」會給你一個商數,如果你只是使用一個浮點數作爲其中一個整數,它實際上會給你像傳統分區一樣的答案。那麼任何百分比方法?是否有運算符來計算Python中的百分比?

+0

要說清楚,你的意思是'x * y/100.0'還是'(x/y)* 100.0'?我們大多數人把它看作乘法;布賴恩把它看作分裂。 – smci

回答

16

在Python中沒有這樣的操作符,但它自己實現是微不足道的。在計算實踐中,百分比幾乎不如模數有用,所以沒有我能想到的語言實現一個。

+0

感謝您的澄清! – nim6us

+0

我想補充一點,即使在數學中,一個比率比一個百分比更有用。百分比只是表示更多人熟悉的比率的一種方式。 – goncalopp

+9

@ nim6us:如果你所需要的只是打印百分比,那麼Python字符串格式就有這樣的指令:'「{:.1%}」。格式(0.1234)' - >''12 .3%''。 – jfs

87

你可以只將您兩個數字,由100注繁殖,如果「整」爲0,這將拋出一個錯誤,因爲問多少比例的0號無厘頭:

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

或者如果您希望它回答的問題是「什麼是20%的5%」,而不是「20%中的5%」(對Carl Smith's answer啓發的問題的不同解釋),您可以這樣寫:

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

謝謝你給我一種替代方法。 – nim6us

+5

你可能想要添加一個如果整體是0返回0,否則這將拋出一個異常。我剛剛遇到了這個,所以我就讓你知道! – andychase

+0

@CarlSmith我沒有複製你的答案;你會注意到我的版本與你的版本不一樣。下半場受到你對這個問題的不同解釋的啓發,所以你是對的,我應該相信你是因爲激勵我添加了這個問題的替代解釋。 –

3

布賴恩的答案(自定義函數)是正確和最簡單的事情一般來說。

但是如果你確實想要用(非標準)'%'操作符來定義數字類型,就像桌面計算器一樣,所以'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的混合物用普通的整數或浮點數。

什麼也這段代碼繁瑣的你還必須形成一個整體或Real的所有21種其他的方法,避免以下惱人的和模糊的類型錯誤時,你實例化它

("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__") 
+3

真正先進的東西,雖然在這種情況下不是一個好主意,但它展示了Python類型的真正力量! – andychase

+0

爲什麼我愛蟒蛇,這是什麼原因。另外,是否可以通過克隆* class *現有的'int'類型,設置'__mod__'和'__mul__'運算符,然後將其指定爲MyNumberClasswithPct?來重新定義所有抽象方法。 – ThorSummoner

+0

如果我這樣做的話,上帝會生氣 – Pitto

1

我覺得問題解決了......在任何情況下,我認爲這個解決方案

def percent(string="500*22%"): 
    if "%" == string[-1] and "*" in string: 
     getnum = string[:-1] 
     ops = getnum.split("*") 
     result = int(ops[0]) * int(ops[1])/100 
     print("The {}% of {} is {}".format(ops[1], ops[0], result)) 
     return result 
    else: 
     print("The argument must be a string like '500*22%'") 


percent("1200*30%") 

[輸出]:

1200的30%是360.0