Mati hat geschrieben:hallo,
ich schaffe es nicht einen float auf ein gültige stelle nach dem komma zu runden...gehtdas nicht mit
a = 0.456
round(a,1) ???
sollte 0.4 ergeben
Eigentlich 0.5, und das geht auch.
Aber 0.4, das geht nicht. `round(x, n)` rundet und gibt eine Fliesskommazahl zurück, die einem `x` auf `n` Nachkommastellen (dezimal) am nächsten kommt. Und 0.4 kann der Computer als Fliesskommazahl nicht darstellen. Kleiner Test, ganz ohne Funktionen:
Code: Alles auswählen
In [1]: 0.1
Out[1]: 0.10000000000000001
In [2]: 0.2
Out[2]: 0.20000000000000001
In [3]: 0.3
Out[3]: 0.29999999999999999
In [4]: 0.4
Out[4]: 0.40000000000000002
In [5]: 0.5
Out[5]: 0.5
zumindest gibt es in der python shell was anderes als im skript - da gehts nämlich.
Das ist nur die Ausgabe. Die Shell benutzt die `repr()` Funktion um Objekte in eine Zeichenkette zur Anzeige umzuwandeln und die ist bei Fliesskommazahlen "ehrlich". Bei ``print`` wird die `str()` Funktion benutzt und die "lügt" bei Fliesskommazahlen weil sie rundet (ich glaube auf 10 Stellen):
Code: Alles auswählen
In [6]: a = 0.3
In [7]: print a
0.3
In [8]: print repr(a)
0.29999999999999999
Ganz wichtig: Diese Ungenauigkeiten in Fliesskommazahlen sind immer da! In jeder Programmiersprache und bei jeder Rechnung. Insbesondere bei Multiplikationen verschlimmern sich die Ungenauigkeiten, aber auch bei vielen Additionen wird ein Ergebnis immer mehr verfälscht.
Und man sollte Fliesskommazahlen auch nie exakt auf Gleichheit oder Ungleichheit testen. Folgendes ist eine Endlosschleife:
Der Wert 1 wird nie *genau* "getroffen".