Seite 2 von 2

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 13:44
von __blackjack__
@c.burkes: Nein, `round()` und `int()` machen da unterschiedliches. `round()` macht unverzerrtes Runden, und `int()` schneidet alle Nachkommastellen ab. Letzteres ist in Python 2 und 3 das gleiche Vehalten.

Python 3:

Code: Alles auswählen

In [7]: [(round(x), int(x)) for x in [0.5, 1.5, 2.5, 3.5, 4.5]]
Out[7]: [(0, 0), (2, 1), (2, 2), (4, 3), (4, 4)]

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 13:45
von c.burkes
Achso ... das meint das round to even ... okay .... worin begruendet sich dann aber das Abschneiden bei float zu int? Also ich meine, warum macht sich das Programm eben nicht die Muehe zu runden .... also kaufmaennisch?

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 13:50
von __blackjack__
@c.burkes: Braucht man dafür eine Begründung? Das ist halt so™. Und auch irgendwie das was man erwartet. Das war bei meiner ersten Programmiersprache so (CBM BASIC V2), das ist bei C so wenn man da implizit oder explizit von Gleitkommazahl zu Ganzzahl gewandelt wird. Kannst ja mal eine Programmiersprache suchen wo das anders gehandhabt wird.

Edit: Warum sollte sich `int()` die Mühe geben zu runden? Dafür gibt es doch `round()`. Beziehungsweise wenn Du eine bestimmte Rundungsart haben möchtest, musst Du ja sowieso selbst Hand anlegen, denn es gibt ja nicht *die* Rundungsart die für alle passt. Da ist es IMHO besser einfach abzuschneiden, und damit die Möglichkeit zu haben basierend darauf eigene Rundungsarten zu implementieren. Das ist mit einfach abschneiden nämlich einfacher als wenn das jetzt beispielsweise kaufmännisch runden würde.

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 13:53
von c.burkes
okay ... der Vergleich zu anderen Sprachen fehlt mir natuerlich komplett und ich haette aus reiner Selbstbezogenheit, da ich eben immer kaufmaennisch Runde, das auch vom Pc so erwartet xD

Aber gut - ist eben nicht so. Danke Dir!
__blackjack__ hat geschrieben: Mittwoch 13. Februar 2019, 13:50 Da ist es IMHO besser einfach abzuschneiden, und damit die Möglichkeit zu haben basierend darauf eigene Rundungsarten zu implementieren. Das ist mit einfach abschneiden nämlich einfacher als wenn das jetzt beispielsweise kaufmännisch runden würde.
Ah ... ich ahne was Du ansprichst. Das klingt logisch *tu*

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 16:58
von DeaD_EyE
Das kaufmännische Runden findet in der Wissenschaft keine Anwendung.
Hier mit einem Video erklärt: https://www.youtube.com/watch?v=3D64rkIy_Ug
Nochmal mit Code erklärt.

Code: Alles auswählen

def kround(number):
    if (number - int(number)) >= 0.5:
        return int(number) + 1
    else:
        return int(number)

numbers = [n + 0.5 for n in range(1,10)]
knumbers = [kround(n) for n in numbers]
wnumbers = [round(n) for n in numbers]
print('Summe:', sum(numbers))
print('Summe aus kaufmännisch gerundeten Zahlen:', sum(knumbers))
print('Summe aus wissenschaftliche gerundeten Zahlen:', sum(wnumbers))
Welches Ergebnis ist nun das beste?
Jemanden, der mir mit kaufmännischen Runden um die Ecke kommt, jage ich zum Teufel!

Re: Zahlen kaufmännisch Runden

Verfasst: Mittwoch 13. Februar 2019, 18:49
von Sirius3
@DeaD_EyE: Deine Funktion kround funktioniert nur für positive Zahlen.

Code: Alles auswählen

def kround(number):
    return int(number) + (abs(number) % 1 >= 0.5) * ((number > 0) * 2 - 1)

Re: Zahlen kaufmännisch Runden

Verfasst: Donnerstag 14. Februar 2019, 08:50
von DeaD_EyE
Habe sie auch nur auf positive Zahlen angewandt :-D
Jetzt sieht sie nicht mehr so schön aus.

Re: Zahlen kaufmännisch Runden

Verfasst: Donnerstag 14. Februar 2019, 09:45
von DeaD_EyE
Ich habe deine Methode mal etwas geändert:

Code: Alles auswählen

def kround2(number):
    sign = -1 if number < 0 else 1
    rest = abs(number) % 1
    number = int(number)
    if rest >= 0.5:
        return number + sign
    else:
        return number
Der Trick mit modulo gefällt mir.

Re: Zahlen kaufmännisch Runden

Verfasst: Donnerstag 14. Februar 2019, 10:27
von __blackjack__
Ich habe das mal so geschrieben als ich es brauchte:

Code: Alles auswählen

def kround(x):
    fractional, integer = math.modf(x)
    return int(integer) + (-1 if x < 0 else 1) * (abs(fractional) >= 0.5)