2013-02-15 23 views
13

Tôi đang cố gắng thực hiện một máy tính hưu trí ngay bây giờ trên Python. Không có gì sai với cú pháp là nhưng khi tôi chạy chương trình sau đây:"Loại không thể đặt lại: int() <str()"

def main(): 
    print("Let me Retire Financial Calculator") 
    deposit = input("Please input annual deposit in dollars: $") 
    rate = input ("Please input annual rate in percentage: %") 
    time = input("How many years until retirement?") 
    x = 0 
    value = 0 
    while (x < time): 
     x = x + 1 
     value = (value * rate) + deposit 
     print("The value of your account after" +str(time) + "years will be $" + str(value)) 

Nó nói với tôi rằng:

Traceback (most recent call last): 
    File "/Users/myname/Documents/Let Me Retire.py", line 8, in <module> 
    while (x < time): 
TypeError: unorderable types: int() < str() 

Bất kỳ ý tưởng làm thế nào tôi có thể giải quyết này?

Trả lời

31

Vấn đề ở đây là input() trả về chuỗi bằng Python 3.x, vì vậy khi so sánh, bạn so sánh chuỗi và số nguyên không được xác định rõ (chuỗi nếu là từ, làm thế nào để so sánh một chuỗi và một số?) - trong trường hợp này Python không đoán, nó ném một lỗi.

Để sửa lỗi này, chỉ cần gọi int() để chuyển đổi chuỗi của bạn đến một số nguyên:

int(input(...)) 

Là một lưu ý, nếu bạn muốn để đối phó với những con số thập phân, bạn sẽ muốn sử dụng một trong float() hoặc decimal.Decimal() (tùy thuộc vào độ chính xác và nhu cầu tốc độ của bạn).

Lưu ý rằng cách lặp vòng nhiều hơn một chuỗi số (ngược lại với vòng lặp while) là sử dụng range(). Ví dụ:

def main(): 
    print("Let me Retire Financial Calculator") 
    deposit = float(input("Please input annual deposit in dollars: $")) 
    rate = int(input ("Please input annual rate in percentage: %"))/100 
    time = int(input("How many years until retirement?")) 
    value = 0 
    for x in range(1, time+1): 
     value = (value * rate) + deposit 
     print("The value of your account after" + str(x) + "years will be $" + str(value)) 
+1

okay Tôi đã tìm ra tất cả. Cảm ơn bạn rất nhiều vì đã dành thời gian và công sức của bạn. Tôi thực sự đánh giá cao nó. Cảm ơn rất nhiều. Có một vấn đề cuối cùng cần giải quyết là tỷ lệ hàng năm giảm theo thời gian. Ví dụ: nếu tôi nhập 500 đô la trong 10 năm với tỷ lệ 50%, nó sẽ mang lại cho tôi 550 đô la sau một năm, 555,0, 555,55, 555.5555, v.v ... Vì nó không thực sự làm 50 phần trăm mỗi năm. – user2074050

+1

@ user2074050 Đó chỉ là lỗi toán học. Bạn đang thêm vào khoản tiền gửi, không phải là giá trị hiện tại. Bạn muốn 'value * = (1 + rate)' (nhân giá trị năm ngoái với tỷ lệ cộng với một). –

0

Bạn cần phải chuyển đổi chuỗi thành số nguyên để so sánh chuỗi trong một điều kiện vòng lặp. Trong thời gian thay thế khác với int (thời gian). Tốt hơn là thay thế nó trước vòng lặp thay vì bên trong điều kiện vòng lặp vì điều đó sẽ làm cho chuỗi được chuyển đổi thành một số nguyên mỗi khi vòng lặp lặp lại.

0

Chỉ cần một lưu ý phụ, trong Python 2.0 bạn có thể so sánh bất kỳ thứ gì với bất kỳ thứ gì (int thành chuỗi). Vì điều này không rõ ràng, nó đã được thay đổi trong 3.0, đó là một điều tốt khi bạn không gặp rắc rối khi so sánh các giá trị vô nghĩa với nhau hoặc khi bạn quên chuyển đổi một loại.

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