Ein “Gotcha” bei Floating-Point-Kram (IEEE 754) ist das Runden:
In JavaScript verhält sich das Runden wie folgt:
> Math.round(0.5)
1
> Math.round(1.5)
2
> Math.round(2.5)
3
> Math.round(3.5)
4
> Math.round(4.5)
5
> Math.round(5.5)
6
In Python hingegen:
>>> round(0.5)
0
>>> round(1.5)
2
>>> round(2.5)
2
>>> round(3.5)
4
>>> round(4.5)
4
>>> round(5.5)
6
JS rundet hier offenbar klassisch kaufmännisch. Aber was macht Python da? Python rundet hier nach dem Prinzip round half to even
, ebenfalls definiert in IEEE 754. Der Hintergrund dieser Idee ist, einen Bias auszugleichen, der auftritt, wenn Summen gerundeter Zahlen gebildet werden:
This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative.
Der Wikipedia-Artikel hat auch eine schöne Tabelle!
Wenn man in Java mit BigDecimal
arbeitet, gibt es da einen sogenannten MathContext
, den man auch beim Runden angeben kann. Darüber kann man genau spezifizieren, wie gerundet werden soll.