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"

War es hilfreich?

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".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top