2011-05-13 40 views
26

Gần đây tôi đã học được rằng dấu "%" được sử dụng để tính phần còn lại của một số nguyên trong Python. Tuy nhiên tôi đã không thể xác định nếu có một nhà điều hành hoặc phương pháp để tính toán phần trăm bằng Python. Giống như với "/" sẽ cung cấp cho bạn các thương, nếu bạn chỉ cần sử dụng một phao cho một trong các số nguyên nó thực sự sẽ cung cấp cho bạn câu trả lời như bộ phận truyền thống. Vì vậy, bất kỳ phương pháp cho tỷ lệ phần trăm?Có một toán tử để tính phần trăm trong Python không?

+0

Để rõ ràng, bạn có nghĩa là 'x * y/100.0' hoặc' (x/y) * 100.0' không? Hầu hết chúng ta đọc nó như là phép nhân; Brian đọc nó như là bộ phận. – smci

Trả lời

16

Không có toán tử nào như vậy trong Python, nhưng nó không quan trọng để thực hiện theo cách của riêng bạn. Trong thực tế trong tính toán, tỷ lệ phần trăm không gần như hữu ích như một modulo, vì vậy không có ngôn ngữ mà tôi có thể nghĩ đến việc thực hiện một.

+0

Cảm ơn bạn đã làm rõ! – nim6us

+0

Tôi muốn thêm rằng ngay cả trong toán học, tỷ lệ hữu ích hơn nhiều so với tỷ lệ phần trăm. Tỷ lệ phần trăm chỉ là một cách để thể hiện tỷ lệ mà nhiều người quen thuộc hơn. – goncalopp

+9

@ nim6us: nếu tất cả những gì bạn cần là in phần trăm thì định dạng chuỗi Python có chỉ thị như vậy: '" {: .1%} ". Định dạng (0.1234)' -> ''12 .3% ''. – jfs

87

Bạn chỉ có thể chia hai số của bạn và nhân với 100. Lưu ý rằng điều này sẽ ném ra một lỗi nếu "toàn bộ" là 0, như hỏi bao nhiêu phần trăm từ 0 một số là không có ý nghĩa:

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

Hoặc nếu câu hỏi bạn muốn trả lời là "5% là 20", thay vì "tỷ lệ phần trăm là 5 trong 20" (giải thích khác nhau của câu hỏi lấy cảm hứng từ Carl Smith's answer), bạn sẽ viết:

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

Cảm ơn bạn đã cho tôi một phương pháp thay thế. – nim6us

+5

Bạn có thể muốn thêm một nếu toàn bộ là 0 trở về 0, vì nếu không thì điều này sẽ ném một ngoại lệ. Tôi chỉ cần chạy vào điều này vì vậy đó là lý do tại sao tôi cho bạn biết! – andychase

+0

@CarlSmith Tôi không sao chép câu trả lời của bạn; bạn sẽ lưu ý rằng phiên bản của tôi không giống với phiên bản của bạn.Phần thứ hai được lấy cảm hứng từ cách giải thích khác nhau của bạn về câu hỏi, vì vậy bạn nói đúng, tôi đáng lẽ phải ghi nhận bạn vì đã truyền cảm hứng cho tôi để thêm giải thích thay thế cho câu hỏi. –

3

Câu trả lời của Brian (một chức năng tùy chỉnh) là điều chính xác và đơn giản nhất để làm nói chung.

Nhưng nếu bạn thực sự muốn xác định loại số với toán tử '%' không chuẩn, như máy tính bàn làm sao cho 'X% Y' có nghĩa là X * Y/100.0, sau đó từ Python 2,6 trở đi bạn có thể xác định lại 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) 
    #... 

Điều này có thể nguy hiểm nếu bạn đã từng sử dụng toán tử '%' trên một hỗn hợp của MyNumberClasswithPct với số nguyên bình thường hay nổi.

gì cũng tẻ nhạt về mã này được bạn cũng phải xác định tất cả 21 phương pháp khác của một Integral hay Real, để tránh những TypeError gây phiền nhiễu và mờ mịt sau khi bạn khởi tạo nó

("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

Các công cụ nâng cao thực sự ở đây mà mặc dù không phải là ý tưởng hay trong trường hợp này, cho thấy sức mạnh thực sự của các loại Python! – andychase

+0

Lý do tại sao tôi yêu python, NÀY. Ngoài ra, có thể không định nghĩa lại tất cả các phương thức trừu tượng bằng cách thực hiện một số phép thuật với nhân bản lớp * kiểu 'int' hiện có, và thiết lập các toán tử' __mod__' và '__mul__', và gán cho nó là MyNumberClasswithPct? – ThorSummoner

+0

Các vị thần sẽ tức giận nếu tôi làm điều đó – Pitto

1

Tôi nghĩ vấn đề đã được giải quyết ... trong mọi trường hợp, tôi nghĩ đến giải pháp này

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%") 

[ra]:

30% của 1200 là 360.0

Các vấn đề liên quan