lo que está haciendo que se llama división entera, lo que descarta cualquier resto, ya que no sería expresar en números enteros, por ejemplo:
1/3 # == 0
Como han mencionado otros encuestados, puede forzar una división de coma flotante. Debe forzar que el primer argumento sea un flotante (1 aquí) llamando a .to_f. El segundo argumento será automáticamente coaccionado a un flotador, es decir .:
1.to_f/3 # ~ 0.3333...
Tenga en cuenta que una vez que se muda a números de punto flotante, el resultado, en términos generales, ya no es exacta. Es por eso que puse ~ 0.333.
Los detalles precisos están más involucrados. En la aritmética de coma flotante binaria, que es común en los microprocesadores actuales, los poderes de 2 siguen siendo exactos, creo.Pero el entero 3, por ejemplo, ya no está representado exactamente, sino solo dentro de la precisión de la representación de punto flotante (típicamente 1E-16 o más o menos para la precisión "doble").
En pocas palabras, aquí hay una regla general: si se trata de valores monetarios, donde la precisión importa (¿alguna vez se notó una discrepancia de 1 centavo en una factura telefónica?) No se almacenan los resultados computados no almacena valores en puntos flotantes En su lugar, utilice tipos de datos enteros o decimales (que almacenan cadenas internamente). Calcule los resultados de coma flotante solo para la visualización y la demanda, si es posible. Evite agregar valores grandes y pequeños juntos una vez que estén flotando, y evite los cálculos encadenados en flotadores. Vuelva a trabajar su álgebra para evitar divisiones hasta el final. Ruby también admite un tipo de datos Rational que representa fracciones exactamente y puede ser útil.
Estos problemas caen bajo la ciencia de la "propagación de error de coma flotante", que es donde puede buscar más información si lo necesita.
¿Por qué un 'BigDecimal'? ¿No bastaría 'to_f' al final de estos valores? –