Seite 1 von 1

x="%.2f"%y

Verfasst: Montag 4. Oktober 2004, 18:08
von pSy
Hallo auch,
der Titel stellt das Problem dar.

Ein kleines Beispiel:

Code: Alles auswählen

y=5.7783
x="%.2f"%y
print x
Ausgabe:

Code: Alles auswählen

'5.78'
Wenn ich jetzt aber eine dynamisches Runden der Zahl möchte, wie stell ich das dann an?

Benutze ich round:

Code: Alles auswählen

accuracy=4
round(y,accuracy)
Ausgabe:

Code: Alles auswählen

5.7782999999999998
Danach könnte ich sicherlich nochmal in einen String umwandeln, aber:

Code: Alles auswählen

x="%."+accuracy+"f"%y
funktioniert nicht...

Wie kann ich das lösen... es kommt mir so einfach vor, aber ich komme einfach nicht darauf :?

Verfasst: Montag 4. Oktober 2004, 18:24
von Milan
Hi. Tja, du hast ja nicht gesagt, dass er die gerundete Zahl als String ausgeben soll:

Code: Alles auswählen

print round(y,4)
Siehe dazu mal diesen Thread für den Unterschied in der Präsentation von floats bei der Ausgabe. Das eine wird nämlich mit repr (interaktiv ohne print) ausgegeben, das andere mittels str (wie es print macht).

Und das andere Problem: Klammern und int zu str konvertieren helfen Wunder :wink:

Code: Alles auswählen

x=("%."+str(accuracy)+"f") % y
mfg Milan

Verfasst: Montag 4. Oktober 2004, 18:27
von CM
Hoi

schau mal hier:

http://docs.python.org/tut/node15.html

Dort steht, warum das mit dem runden nicht klappt.

Was Deine letzte Zeile anbelangt: Wie man eine dynamische implementation implementiert ist mir offengestanden auch nicht klar.

Tut mir leid, aber vielleicht gibt es ja noch Ideen ...
Gruss
Christian

Verfasst: Montag 4. Oktober 2004, 18:28
von CM
... na, da war wohl jemand schneller ...

Verfasst: Montag 4. Oktober 2004, 18:32
von hans
Versteh das Problem nicht so ganz. Was möchtest du erreichen?

Code: Alles auswählen

>>> y=5.7783
>>> print "%.2f" % y
5.78
>>> print "%.3f" % y
5.778
>>> print "%.4f" % y
5.7783
>>> print "%.5f" % y
5.77830
>>>         
Das eine Floatingpoint Variable nach dem Runden nicht immer exakt den erwarteten Wert hat, liegt in der Natur der Sache. Floatingpoint Variablen haben immer einen Rest Ungenauigkeit, dass dürfte bei so ziemlich so allen Sprachen der Fall sein. Lediglich Integer Zahlen lassen sich exakt darstellen und reproduzieren.

Hans

/* Edit: oops, da waren wohl zwei schneller ;) */

Verfasst: Montag 4. Oktober 2004, 19:09
von Dookie
Hallo,

Mal ganz dynamisch :)

Code: Alles auswählen

for i in xrange(2,6):
    print "%%.%if" % i % 3.1415926535897931
zur Erklährung "%%.%if" mit z.B. % 3 ergibt "%.3f" und das dann mit % 3.1415.... ergibt die ausgabe 3.142


Gruß

Dookie

Verfasst: Dienstag 5. Oktober 2004, 07:08
von Gast
danke dookie, genau das wollte ich haben... hab es aber inzwischen auch schon anders lösen können:

Code: Alles auswählen

y = round(x,accuracy)
x = str(x)
schon klappt es mit dem runden, denn zum glück will ich es ja am ende als str()
das mit den ungenauigkeiten kenne ich übrigens schon, genau dieses problem wollte ich ja umgehen, wusste nur nicht so recht wie.

und nochmals danke an dookie... ich glaube nämlich, dass ich deinen vorschlag noch woanders sehr gut einsetzen kann...

Verfasst: Mittwoch 6. Oktober 2004, 07:06
von pSy
uups... war ich doch als Gast drin :oops:
ja, der gast war ich :)