2013-02-15 3 views
13

Ich versuche, einen Pneus Rechner auf Python zu machen. Es ist nichts falsch mit der Syntax, aber wenn ich das folgende Programm ausführen:"Unorderable Typen: 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)) 

Es sagt mir, dass:

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

Irgendwelche Ideen, wie ich dieses Problem lösen könnte?

Antwort

31

Das Problem hier ist, dass input() eine Zeichenfolge in Python 3.x zurückgibt, also, wenn Sie Ihren Vergleich durchführen, vergleichen Sie eine Zeichenfolge und eine ganze Zahl, die nicht gut definiert ist (was ist, wenn die Zeichenfolge ein Wort ist, Wie vergleicht man einen String und eine Zahl?) - In diesem Fall rät Python nicht, es löst einen Fehler aus.

Um dies zu beheben, einfach int() rufen Sie Ihren String in einen Integer zu konvertieren:

int(input(...)) 

Als Hinweis, wenn Sie mit Dezimalzahlen beschäftigen möchten, sollten Sie einen von float() oder decimal.Decimal() verwenden (abhängig von Ihren Genauigkeits- und Geschwindigkeitsanforderungen).

Beachten Sie, dass die mehr pythonische Art der Schleife über eine Reihe von Zahlen (im Gegensatz zu einer while Schleife und Zählung) ist, range() zu verwenden. Beispiel:

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, ich habe es herausgefunden. Vielen Dank für Ihre Zeit und Mühe. Ich weiß es wirklich zu schätzen. Vielen Dank, lieber Herr. Es gibt eine letzte Frage, die gelöst werden muss, nämlich dass die jährliche Rate mit der Zeit abnimmt. Zum Beispiel, wenn ich 500 Dollar über 10 Jahre bei 50% Rate einbeziehe, gibt es mir 550 Dollar nach einem Jahr, 555.0, 555.55, 555.5555, etc ... Da es nicht wirklich 50 Prozent jährlich macht. – user2074050

+1

@ user2074050 Das ist nur ein mathematischer Fehler. Sie fügen der Einzahlung nicht den aktuellen Wert hinzu. Sie wollen 'Wert * = (1 + Rate)' (multiplizieren Sie den Wert des letzten Jahres mit der Rate plus eins). –

0

Sie müssen Ihre Zeichenfolge in eine Ganzzahl konvertieren, um sie innerhalb einer Schleifenbedingung zu vergleichen. In anderen ersetzen Zeit mit int (Zeit). Es ist besser, sie vor der Schleife als innerhalb der Schleifenbedingung zu ersetzen, da dies dazu führen würde, dass die Zeichenfolge jedes Mal in eine Ganzzahl umgewandelt wird, wenn die Schleife iteriert.

0

Nur eine Randnotiz, in Python 2.0 konnten Sie alles mit allem vergleichen (int zu string). Da dies nicht explizit war, wurde es in 3.0 geändert, was eine gute Sache ist, da Sie nicht die Mühe haben, sinnlose Werte miteinander zu vergleichen oder wenn Sie vergessen, einen Typ zu konvertieren.