Strano problema di arrotondamento con l'identificatore del formato printf ruby
-
10-07-2019 - |
Domanda
Qualcuno ha qualche idea su questo?
Quando eseguiamo:
printf ("%. 0f " ;, 40.5)
In una finestra di Windows il ritorno è "41" ma sul nostro server Ubuntu di produzione stiamo ottenendo "40"
Soluzione
Sembra un semplice caso di imprecisione binaria in virgola mobile . Su una macchina ottieni 40.499999999 che arriva a 40; sull'altra macchina ottieni 40.500000000001 che arriva a 41.
Se hai bisogno di numeri esatti, non dovresti usare il punto mobile binario. Puoi utilizzare il punto fisso decimale o il punto decimale in virgola mobile.
Modifica: stai usando BigDecimal, dici. Perché non evitare alcuna conversione in float usando #round
e quindi #to_i
? (Oppure #floor
o #ceil
invece di #round
... non è chiaro quale sia il tuo obiettivo.)
b = BigDecimal.new("40.5")
print b.round.to_i # => 41
Altri suggerimenti
Che ne dici di usare .round
invece? Rails lo migliora anche in modo da poter specificare la precisione ( vedi API doc ).
usa% .0g invece
La risposta di ScottJ non spiega il tuo problema - 40.5 è esattamente rappresentabile in binario. Ciò che sta probabilmente accadendo è questo: "stampa di Windows" arrotonda per metà, " e la stampa di Ubuntu "arrotonda la metà anche."