Problema de redondeo extraño usando el ruby ??printf-format-specifier
-
10-07-2019 - |
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 ''
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. ''