Seite 1 von 1

Round, seltsames Verhalten

Verfasst: Donnerstag 16. November 2017, 15:28
von \^/ili
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

Re: Round, seltsames Verhalten

Verfasst: Donnerstag 16. November 2017, 15:35
von kbr
@\^/ili: Die Antwort darauf findet sich in der Doku:
https://docs.python.org/2.7/library/fun ... ound#round

Re: Round, seltsames Verhalten

Verfasst: Donnerstag 16. November 2017, 16:00
von Sirius3
@\^/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.

Re: Round, seltsames Verhalten

Verfasst: Donnerstag 16. November 2017, 16:09
von \^/ili
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