Write a Python script that asks for two numbers and store them in the variables x and y, respectively. Make sure that x and y are of type float. The script should then check whether x equals y. Why is the following code not a good idea to do so? Provide a better solution.
x == y
Das ist die Aufgabe. Ich habe also folgenden Code geschrieben:
x=input('x')
y=input('y')
x==y
Der funktioniert auch gut, wenn ich z.B. 2.5 mit 2.5 vergleiche. Wenn ich aber 2.5 mit 5/2 vergleiche funktioniert es nicht mehr. Ist das mit dem obergenannten "not a good idea" gemeint oder ist es viel einfacher zu lösen?
Wie würde ich denn das Problem mit 5/2 umgehen? Als Input eingegeben will Python es irgendwie nicht in eine float umwandeln, sondern bezeichnet es immer als string.
Ich hoffe, ihr könnt mir helfen.
Vielen Dank und Grüße,
Karl
Frage zu Uni-Aufgabe
`input` liefert immer Strings als Ergebnis, daher auch die Bedingung, dass das Floats sein sollen.
Aus der Aufgabe lese ich nicht heraus, dass welche Art Eingaben unterstütz werden sollen, also dass 5/2 eine valide Eingabe ist.
Wenn das der Fall wäre, müßte man selbst einen Parser schreiben, der auch mit Brüchen umgehen kann.
Gleichheit ist bei floating-Pointzahlen wegen ihrer endlichen Genauigkeit manchmal nicht exakte Gleichheit. Bei der Aufgabe, dass man direkt Eingaben vergleichen kann (auch wenn man die als Brüche angibt) tritt das Problem aber nicht auf. Daher weiß ich auch nicht, was mit "keine gute Idee" in diesem Kontext gemeint ist. Da hätte man ein besseres Beispiel finden können.
Aus der Aufgabe lese ich nicht heraus, dass welche Art Eingaben unterstütz werden sollen, also dass 5/2 eine valide Eingabe ist.
Wenn das der Fall wäre, müßte man selbst einen Parser schreiben, der auch mit Brüchen umgehen kann.
Gleichheit ist bei floating-Pointzahlen wegen ihrer endlichen Genauigkeit manchmal nicht exakte Gleichheit. Bei der Aufgabe, dass man direkt Eingaben vergleichen kann (auch wenn man die als Brüche angibt) tritt das Problem aber nicht auf. Daher weiß ich auch nicht, was mit "keine gute Idee" in diesem Kontext gemeint ist. Da hätte man ein besseres Beispiel finden können.
Du musst die Eingabe an die float()-Funktion übergeben, damit der String in einen Float umgewandelt wird.
Wie kommst du denn bei der zweiten Eingabe auf 5/2? Soll y immer als Bruch angegeben werden oder wie ist das gemeint?
Wie kommst du denn bei der zweiten Eingabe auf 5/2? Soll y immer als Bruch angegeben werden oder wie ist das gemeint?
Für Brüche kann man auch einfach das fractions-Modul benutzen. Analog dazu gibt es für Dezimalzahlen das decimal-Modul:Sirius3 hat geschrieben: Freitag 25. Oktober 2019, 14:58 Aus der Aufgabe lese ich nicht heraus, dass welche Art Eingaben unterstütz werden sollen, also dass 5/2 eine valide Eingabe ist.
Wenn das der Fall wäre, müßte man selbst einen Parser schreiben, der auch mit Brüchen umgehen kann.
Code: Alles auswählen
from decimal import Decimal
from fractions import Fraction
print(Decimal("2.5") == Fraction("5/2"))
- noisefloor
- User
- Beiträge: 4192
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Und du würdest auch "False" bekommen, wenn x=2.5 und y=2.50, obwohl das ja mathematisch gleich ist. Also ist es wahrscheinlich eine gute Idee, die Eingabe in einen `float` umzuwandeln. Wenn man es einfach halten will. Kann man aber beliebig komplex ausbauen, siehe vorherige Posts.
Gruß, noisefloor
Richtig. `input` liefert immer eine String. Darum wird die Eingabe von "5/2" auch nicht zu 2.5 umgerechnet.Als Input eingegeben will Python es irgendwie nicht in eine float umwandeln, sondern bezeichnet es immer als string.
Und du würdest auch "False" bekommen, wenn x=2.5 und y=2.50, obwohl das ja mathematisch gleich ist. Also ist es wahrscheinlich eine gute Idee, die Eingabe in einen `float` umzuwandeln. Wenn man es einfach halten will. Kann man aber beliebig komplex ausbauen, siehe vorherige Posts.
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 14050
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@wowlol: Egal wie Du den Vergleich machst, Du solltest das Ergebnis auch ausgeben, damit der Benutzer das sehen kann. Einfach nur ``x == y`` oder einen anderen Ausdruck hin zu schreiben ist etwas sinnlos, denn davon bekommt der Benutzer nur etwas mit wenn der Ausdruck einen Laufzeitfehler auslöst.
Zur Lösung könntest Du auch mal einen Blick in das `math`-Modul werfen, denn dort gibt es eine passende Funktion für diese Aufgabe.
Zur Lösung könntest Du auch mal einen Blick in das `math`-Modul werfen, denn dort gibt es eine passende Funktion für diese Aufgabe.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
@wowlol: der Kontext dieser Aufgabe ist unklar. Das der direkte Vergleich von x und y keine gute Lösung sein soll, könnte darauf hindeuten, dass Differenzen unterhalb eines gegebenen Epsilon tolerierbar sind. Dann hilft der Hinweis von __blackjack__. Ansonsten wäre ˋx == yˋ völlig in Ordnung.
- __blackjack__
- User
- Beiträge: 14050
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Um dann mal aufzulösen welche Funktion aus `math` gemeint war:
Wobei das für dieses Programm eigentlich egal ist ob man ``==`` oder `math.isclose()` verwendet. Es gibt in beiden Fällen nur einen einzigen Fall bei dem bei der gleichen Eingabe für `x` und `y` die Antwort kommt das sich `x` und `y` unterscheiden — und in dem Fall stimmt das per Definition sogar.
Code: Alles auswählen
#!/usr/bin/env python3
import math
def ask_float(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print("Fehler! Die Eingabe war keine Zahl.")
def main():
x = ask_float(" Bitte die erste Zahl eingeben: ")
y = ask_float("Bitte die zweite Zahl eingeben: ")
if math.isclose(x, y):
print("Die beiden Zahlen sind gleich.")
else:
print("Die beiden Zahlen unterscheiden sich.")
if __name__ == "__main__":
main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari