Round, seltsames Verhalten

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
\^/ili
User
Beiträge: 9
Registriert: Samstag 8. Juni 2013, 19:57

Hallo Kollegen,

Folgendes treibt mich seit Stunden um

Code: Alles auswählen

C:\Users\nagy>python --version
Python 2.7.10

C:\Users\nagy>python -c "print round(731.925,2)"
731.92
es sollte IMHO 731,93 erscheinen.

Ich könnte natürlich folgendes machen

Code: Alles auswählen

C:\Users\nagy>python -c "x=731.925;print round((x*100+.5)/100,2)"
731.93
Aber das dünkt mir etwas COBOL mäßig an, und ich bin mir gar nicht sicher ob das betriebssicher funktioniert.

Hat jemand eine Idee, könnte es an der "ungenauen" Zahlendarstellung bei float liegen?

Noch ein paar Versuche ( dabei funktioniert es)

Code: Alles auswählen

C:\Users\nagy>python -c "print round(.5)"
1.0

C:\Users\nagy>python -c "print round(.05,1)"
0.1

C:\Users\nagy>python -c "print round(.005,2)"
0.01

Lg
\^/ili

Zusatz:
auf einem Linuxrechner passiert das gleiche

Code: Alles auswählen

wnagy@avalubu:~$ python -c "print round(731.925,2)"
731.92
Zuletzt geändert von \^/ili am Donnerstag 16. November 2017, 15:35, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@\^/ili: Die Antwort darauf findet sich in der Doku:
https://docs.python.org/2.7/library/fun ... ound#round
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@\^/ili: das liegt daran, dass Dezimalzahlen nicht exakt als Binärzahlen darstellbar sind:

Code: Alles auswählen

>>> '{:.16f}'.format(731.925)
'731.9249999999999545'
Deine komische COBOL-Rundungsformel ist falsch. Das "rundet" nämlich nur diese eine Zahl "richtig".
Die Funktion `round` gehört zu einer der vielen mißverstandenen Funktionen. Es gibt so ~6 verschiedene Rundungsvorschriften und bei jeder muß man sich bewußt sein, dass das Ergebnis verfälscht wird; 731.93 ist ebenso valide wie 731.92.
\^/ili
User
Beiträge: 9
Registriert: Samstag 8. Juni 2013, 19:57

Liebe Kollegen,

Beide besten Dank,
Schande über mich! die Doku zwar gelesen, aber nicht ganz! Den Teil mit den Restriktionen ---
Tschuldigung dafür, dass ich eure Zeit verschwendet habe.

War "Grabsteineffekt" alles bestens...

Danke nochmal für die Hilfe.

BTW: man merkt, dass ich schon lange kein COBOL mehr programmiert habe :-)

lg
\^/il
Antworten