x="%.2f"%y

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
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

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 :?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

... na, da war wohl jemand schneller ...
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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 ;) */
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
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...
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

uups... war ich doch als Gast drin :oops:
ja, der gast war ich :)
Antworten