kaufmännisch runden und Problem bei Werteübergabe

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.
Benutzeravatar
reggid
User
Beiträge: 120
Registriert: Dienstag 8. Oktober 2002, 19:04
Wohnort: Dinslaken
Kontaktdaten:

kaufmännisch runden und Problem bei Werteübergabe

Beitragvon reggid » Donnerstag 17. Oktober 2002, 09:54

Code: Alles auswählen

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 ?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Re: kaufmännisch runden und Problem bei Werteübergabe

Beitragvon Voges » Donnerstag 17. Oktober 2002, 11:29

Hallo!
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:

print Runden(1.345) -> Ausgabe: 1
print Runden(1.745) -> Ausgabe: 2


Es geht aber auch kürzer:

Code: Alles auswählen

def Runden(zahl):
    return int(zahl + 0.5)

Allerdings, beide Funktionen runden bei negativen Zahlen falsch. Besser wäre da wohl folgende Lösung:

Code: Alles auswählen

def Runden(zahl):
    if zahl >= 0:
        return int(zahl + 0.5)
    else:
        return int(zahl - 0.5)

Jan
Benutzeravatar
reggid
User
Beiträge: 120
Registriert: Dienstag 8. Oktober 2002, 19:04
Wohnort: Dinslaken
Kontaktdaten:

Danke

Beitragvon reggid » Donnerstag 17. Oktober 2002, 12:52

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

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 13:58

Hallo,

mit der Funktion floor aus dem math-Modul spart mann sich die Abfrage vom Vorzeichen.

Code: Alles auswählen

from math import *

Runden = lambda x: floor(x+0.5)

a = 1.5
b = 1.75

print Runden(a)
1.0
print Runden(b)
2.0
print Runden(-a)
-1.0
print Runden(-b)
-2.0



Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Donnerstag 17. Oktober 2002, 14:32

Hallo!
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.)

Jan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 14:44

Hi Voges,

jo stimmt, mein Fehler, ausserdem sollte es heissen a=1.25 ;)
Aber mit einer kleinen Änderung lässt sich das Fehlverhalten leicht beheben.

Code: Alles auswählen

from math import *

Runden = lambda x: floor(x+0.499999)

a = 1.25
b = 1.75
c = 1.5

print Runden(a)
1.0
print Runden(b)
2.0
print Runden(c)
2.0

print Runden(-a)
-1.0
print Runden(-b)
-2.0
print Runden(-c)
-2.0

kommt wohl daher, daß die Computer intern binär rechnen.


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Donnerstag 17. Oktober 2002, 14:47

Hallo!

Dookie hat geschrieben:Runden = lambda x: floor(x+0.499999)


jetzt klappt es für 1.5 nicht mehr.
Ein Versuch hast Du noch. :-)
Jan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 14:56

Gerade gemerkt :D

Code: Alles auswählen

Runden = lambda x: floor(x+0.5+((x/(abs(x+0.000001))*0.000001)))


mit Trick 17 1/2 funktionierts :P


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Donnerstag 17. Oktober 2002, 15:19

Hallo!
Dookie hat geschrieben:Runden = lambda x: floor(x+0.5+((x/(abs(x+0.000001))*0.000001)))

mit Trick 17 1/2 funktionierts :P

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

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 15:28

Hi Voges,

nun die ultimative Lösung:

Code: Alles auswählen

Runden = lambda x: floor(x+0.5+(0.000001* ((not x) or (x/abs(x)))))


wer da noch durchblickt ist selber schuld :lol:


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Donnerstag 17. Oktober 2002, 15:58

Hallo!

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

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 16:21

Python is schön :D


Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Donnerstag 17. Oktober 2002, 18:49

hallo!
Dookie hat geschrieben:Python is schön :DDookie

Ich glaube, Du kann die beiden Snippet-Beiträge wieder löschen.

round(x[, n]) existiert als Build-In Funktion :-\
Jan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 17. Oktober 2002, 18:59

Hi Jan,

:lol:

hat aber trotzdem spaß gemacht! :)
Und als Beispiele sind sie immer noch brauchbar.

Dookie
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Beitragvon RicmanX » Donnerstag 17. Oktober 2002, 21:50

Voges hat geschrieben:hallo!
Ich glaube, Du kann die beiden Snippet-Beiträge wieder löschen.

round(x[, n]) existiert als Build-In Funktion :-\
Jan


Code: Alles auswählen

>>> round(1.35,1)
1.3999999999999999


Das ist nur eine von vielen "Möglichkeiten" die ich bei der Erstellung meines Downloadscriptes entdeckte ;)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]