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.
def Runden(zahl): # meine Funktion zum Runden
if (zahl<int(zahl)+0.5):
zahl=int(zahl) #Abrunden !
else:
zahl=int(ceil(zahl)) #Abrunden !
return zahl
Diese Funktion soll Zahlen runden, wenn die Zahl >=0.5 liegt aufrunden und drunter liegt abrunden !
Wenn ich aber nun eine Zahl übergebe, sagen wir 1.745 , also
Runden(1.745), dann kommt dort automatisch nur 1 an und dann kann man das runden vergessen !
So wie kann ich mich diesem Problem entledigen ?
reggid hat geschrieben:
Wenn ich aber nun eine Zahl übergebe, sagen wir 1.745 , also
Runden(1.745), dann kommt dort automatisch nur 1 an und dann kann man das runden vergessen !
Hm, dann musst Du schon beim Aufruf der Funktion was falsch machen. Bei mir funktioniert es:
Jo du hast recht deine Funktion ist viel einfacher und meine Rechnnungen hießen alle a/7 anstatt a/7.00, deswegen vielen einfach die Nachkommastellen weg *g*
Dookie hat geschrieben:a = 1.5
print Runden(-a)
-1.0
Ich bin jetzt etwas verunsichert. Ich dachte, beim Runden wird nur der Betrag beachtet, also unabhängig vom Vorzeichen. Also, |-1.5| ist 1.5 und ergibt nach der Rundungsregel, dass ab .5 aufgerundet wird, 2 für den Betrag und somit schließlich -2. (das 1.5 -> 1.0 wird ein Typo von Dir sein.)
Dookie hat geschrieben:
Runden = lambda x: floor(x+0.5+((x/(abs(x+0.000001))*0.000001)))
mit Trick 17 1/2 funktionierts
Trick 17 wollte ich gerade kommentieren . Da warst Du schneller. Jetzt hast Du eigenlich nur noch das (vielleicht vernachlässigbare) Problem eines ZeroDivisionErrors, wenn x = -0.000001.
Jan
Dookie hat geschrieben:Runden = lambda x: floor(x+0.5+(0.000001* ((not x) or (x/abs(x)))))
Jaaaa, 'not x or' ist die Lösung! Eigentlich eine Technik, die man bei Perl früh lernt, die mir bei Python noch nicht so häufig untergekommen ist. Das x/abs(x) hatte ich auch schon, aber wegen x == 0 sofort verworfen. Aber so geht es.
Hier noch zwei vielleicht lesbarere Varianten, die hoffentlich funktionieren (besonders gut gefällt mir das "not x or x"):
Runden = lambda x: int(x+0.5 * ((not x) or (x/abs(x)))) Runden = lambda x: int(x+0.5 * (x/abs(not x or x)))
Jan
Nachtrag: Runden = lambda x: int(x+ 0.5 * ((x > 0) or -1))
Und nu' kommst Du ;-)
Jan
RicmanX hat geschrieben:>>> round(1.35,1)
1.3999999999999999
Dafür reicht schon Folgendes: >>> 1.0/10
0.10000000000000001
>>>
Aber das liegt nun mal in der Natur der Sache, sprich der internen Darstellung von Fließkommazahlen.
Ich weiß daß das sp ist, auch wenn ich nicht weiß wie man Fließkomma in Biär darstellt. Das tut aber auch nichts zu Sache. Nur diese Pfennigsfuchserei.....
Ich hole mal gerade mein altes Lehrbuch (Küster Thiel Fischbeck, Logarithmische Rechentafeln, 100. Auflage, 1969)
Der Mangel an mathematischer Bildung gibt sich durch nichts so auffallend zu erkennen, wie durch maßlose Schärfe im Zahlenrechnen
Das Problem ist ja das man mit den Zahlen - ich zumindest - weiterrechnen muss, und Genauigkeit ist auch notwendig.
Und wenn ich ne Zahl mit zehn Nachkommastellen hab, ist das genauso schlecht wie wenns 50 auch nur um nicht sehr viel falsch ist... alle andern Sprachen können schließlich rechnen, das und das Python nur auf wenigen Servern installiert ist ist mE das einzige Manko an Python.