ronud(float,1) nur in skript und nicht in der python shell

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mati
User
Beiträge: 68
Registriert: Dienstag 6. Juni 2006, 16:54

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


zumindest gibt es in der python shell was anderes als im skript - da gehts nämlich.
danke
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

tschuldigung, dass ich dir nicht helfen kann, aber noch was:

Code: Alles auswählen

>>> a = 0.456
>>> round(a,1)
0.5
>>> round(a,2)
0.46000000000000002
>>> round(a,3)
0.45600000000000002
>>> round.__doc__
'round(number[, ndigits]) -> floating point number\n\nRound a number to a given precision in decimal digits (default 0 digits).\nThis always returns a floating point number.  Precision may be negative.'
>>>         
was ist das für ein runden, wenn ich auf die zweite stelle hinter dem komma runden möchte, aber das ergebnis damit nicht übereinstimmt?
(python 2.4.3 final)
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mati hat geschrieben:round(a,1) ???
Hi Mati!

``round()`` gibt laut Definition eine Fließkommazahl zurück. Das bedeutet, dass man mit dem Ergebnis von ``round()`` weiterrechnen kann, ohne wieder von String nach Float umwandeln zu müssen. ``round()`` ist also nicht für die Anzeige von Zahlen gedacht!

Willst du die Zahl einfach nur anzeigen, dann verwende

Code: Alles auswählen

"%.2f" % 0.456
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

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:

Code: Alles auswählen

a = 0
while a != 1:
    a += 0.1
Der Wert 1 wird nie *genau* "getroffen".
Antworten