Seite 1 von 1

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

Verfasst: Montag 16. Oktober 2006, 09:02
von Mati
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

Verfasst: Montag 16. Oktober 2006, 09:10
von murph
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)

Re: ronud(float,1) nur in skript und nicht in der python she

Verfasst: Montag 16. Oktober 2006, 09:36
von gerold
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
:-)

Re: ronud(float,1) nur in skript und nicht in der python she

Verfasst: Montag 16. Oktober 2006, 10:44
von 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".