Pregunta

¿Alguien tiene alguna idea sobre este?

Cuando corremos:

printf ("%. 0f " ;, 40.5)

En un cuadro de Windows, el retorno es " 41 " pero en nuestro servidor ubuntu de producción estamos obteniendo '' 40 ''

¿Fue útil?

Solución

Parece un caso simple de imprecisión de punto flotante binario . En una máquina obtienes 40.499999999 que se redondea a 40; en la otra máquina obtienes 40.500000000001 que se redondea a 41.

Si necesita números exactos, entonces no debe usar coma flotante binaria. Puede usar punto fijo decimal o coma flotante decimal.

Editar: estás usando BigDecimal, dices. ¿Por qué no evitar cualquier conversión a flotante usando #round y luego #to_i ? (O #floor o #ceil en lugar de #round ... no está claro cuál es su objetivo.

b = BigDecimal.new("40.5")
print b.round.to_i  # => 41

Otros consejos

¿Qué tal usar .round en su lugar? Rails incluso lo mejora para que pueda especificar la precisión ( ver API doc ).

use% .0g en su lugar

La respuesta de ScottJ no explica su problema: 40.5 es exactamente representable en binario. Lo que probablemente está sucediendo es esto: printf de Windows se redondea a la mitad, y printf de Ubuntu '' redondea la mitad incluso. ''

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top