Ungewöhnliches Rundungsproblem mit dem Ruby Printf-Format-Specifier
-
10-07-2019 - |
Frage
Hat jemand irgendwelche Ideen zu diesem?
Wenn wir rennen:
printf("%.0f", 40.5)
In einer Windows -Box ist die Rückgabe "41", aber auf unserem Produktions -Ubuntu -Server erhalten wir "40"
Lösung
Sieht aus wie ein einfacher Fall von Binärer schwebender Punkt Uneinheitliche. Auf einer Maschine erhalten Sie 40.499999999, was auf 40 rundet; Auf der anderen Maschine erhalten Sie 40.500000000001, was auf 41 rundet.
Wenn Sie genaue Zahlen benötigen, sollten Sie keinen binären schwimmenden Punkt verwenden. Sie können feste Punkte -Dezimal- oder Dezimalausschwebungspunkte verwenden.
Bearbeiten: Sie verwenden BigDecimal, sagen Sie. Vermeiden Sie eine Konvertierung zum Float durch die Verwendung #round
und dann #to_i
? (Oder #floor
oder #ceil
Anstatt von #round
... Es ist nicht klar, was Ihr Ziel ist.)
b = BigDecimal.new("40.5")
print b.round.to_i # => 41
Andere Tipps
Wie wäre es mit Verwendung .round
stattdessen? Rails verbessert es sogar, damit Sie die Präzision angeben können (Siehe API Doc).
Verwenden Sie stattdessen %.0g
Scottjs Antwort erklärt Ihr Problem nicht - 40,5 ist genau in Binary dargestellt. Was wahrscheinlich passiert, ist Folgendes: Windows 'printf "runden halb hoch" und Ubuntus Printf "runden nur halb sogar".