2010-11-20 3 views
1

Warum macht round() einen besseren Job als die printf Art der String-Formatierung?Warum macht Ruby 14.5.round() einen besseren Job (gibt 15) als "% .0f"% 14.5 (gibt 14)

ruby-1.9.2-p0 > "%.0f" % 14.5 
=> "14" 

ruby-1.9.2-p0 > "%.0f" % 14.5000001 
=> "15" 

ruby-1.9.2-p0 > 14.5.round 
=> 15 
+0

Eeemmmm ... weil ... weil. http://en.wikipedia.org/wiki/Printf und http://en.wikipedia.org/wiki/Rounding#Rounding_to_integer - viele Dinge zu lesen. – Nakilon

+0

Entspricht [dieser Frage] (http://stackoverflow.com/questions/588004/is-javascripts-math-broken), obwohl es in einer anderen Sprache ist. –

+0

@Andrew Grimm Es ist nicht äquivalent, weil es versucht, den Unterschied zwischen "% .0f"% 14.5 "und" 14.5.round.to_s "(zB was sind die spezifischen Nuance-Regeln von% f?) –

Antwort

1

"Bessere Arbeit"? Nein, nicht, wenn du dich um Dinge kümmerst, die ausreißen. Daher rund zu gerade.

+1

Runde gegen gerade zu bekommen ? Was meinen Sie? Runden nur bis 14 und dann bis 16 als nächstes? –

+2

Genau das meint er. Wenn Sie x.5 immer auf runden, haben Sie eine kleine, aber statistisch signifikante Tendenz, bei der ein Gesamt- oder Durchschnittswert zu hoch ist. Das Runden von x.5 auf die nächste gerade Zahl wirkt dem Bias-Effekt entgegen. – Bevan

3

Nur weil Sie in der Schule gelernt haben, dass .5 immer aufgerundet wird, bedeutet das nicht, dass dies der einzig richtige Weg ist. Es gibt eine ganze Reihe von verschiedenen rounding modes; Was Sie sehen, ist höchstwahrscheinlich "rund auf gerade", was .5 in Richtung der geraden ganzen Zahl rundet; Dies hat den Vorteil, dass es nicht zu einer generellen Aufwärtsneigung kommt, wie es immer das Aufrunden tut.

Hochwertige mathematische Bibliotheken wie Ruby Flt bieten im Allgemeinen eine Möglichkeit, den Rundungsmodus explizit auszuwählen.

Verwandte Themen