2013-02-15 18 views
13

Próbuję teraz wykonać kalkulator emerytalny na Pythonie. Nie ma nic złego w składni ale kiedy uruchomić następujący program:"Typy nieobsługiwane: 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)) 

on mi mówi, że:

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

Jakieś pomysły jak mogę rozwiązać ten problem?

Odpowiedz

31

Problem polega na tym, że input() zwraca ciąg znaków w języku Python 3.x, więc podczas porównywania porównywany jest łańcuch i liczba całkowita, która nie jest dobrze zdefiniowana (co jeśli łańcuch jest słowem, jak porównać ciąg i liczbę?) - w tym przypadku Python się nie domyśla, rzuca błąd.

Aby rozwiązać ten problem, wystarczy zadzwonić int() przekształcić swój ciąg do liczby całkowitej:

int(input(...)) 

Na marginesie, jeśli chcemy mieć do czynienia z liczbami po przecinku, możesz użyć jednego z float() lub decimal.Decimal() (w zależności od twoich potrzeb dotyczących dokładności i szybkości).

Zauważ, że bardziej pytonowym sposobem zapętlenia serii liczb (w przeciwieństwie do pętli while i zliczania) jest użycie range(). Na przykład:

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

OK, wszystko wymyśliłem. Dziękuję bardzo za twój czas i wysiłek. Naprawdę to doceniam. Dziękuję bardzo życzliwy panie. Jest jeszcze jeden problem do rozwiązania, który polega na tym, że roczna stopa maleje wraz z upływem czasu. Na przykład, jeśli wprowadzę 500 dolarów w ciągu 10 lat przy stawce 50%, da mi to 550 dolarów po roku, 555,0, 555.55, 555.5555 itd. Tak jak w rzeczywistości, nie robi to 50 procent rocznie. – user2074050

+1

@ user2074050 To tylko błąd matematyczny. Dodajesz do depozytu, a nie aktualną wartość. Chcesz 'value * = (1 + rate)' (pomnóż ubiegłoroczną wartość przez kurs plus jeden). –

0

Konwertuj ciąg znaków na liczbę całkowitą, aby porównać je w warstwie pętli. W innym czasie zamień na int (czas). Lepiej jest zastąpić go przed pętlą, niż w pętli, ponieważ spowoduje to konwersję ciągu na liczbę całkowitą za każdym razem, gdy pętla będzie wykonywana iteracyjnie.

0

Nawiasem mówiąc, w Pythonie 2.0 można porównać wszystko do czegokolwiek (int do napisu). Ponieważ nie było to wyraźne, zostało zmienione w wersji 3.0, co jest dobre, ponieważ nie próbujesz porównywać bezsensownych wartości ze sobą lub gdy zapominasz przekonwertować typ.