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"

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top