round rails float ruby math floating-point division integer-division

rails - ¿Por qué la división en Ruby devuelve un número entero en lugar de un valor decimal?



ruby integer division (7)

Cambia el 5 a 5.0 . Estás obteniendo división entera.

Por ejemplo:

9 / 5 #=> 1

pero esperaba 1.8 . ¿Cómo puedo obtener el resultado decimal correcto (no entero)? ¿Por qué está volviendo 1 en absoluto?


Está haciendo división entera. Puedes hacer que uno de los números sea Float agregando .0 :

9.0 / 5 #=> 1.8 9 / 5.0 #=> 1.8


Está haciendo división entera. Puedes usar to_f para forzar cosas en modo de punto flotante:

9.to_f / 5 #=> 1.8 9 / 5.to_f #=> 1.8

Esto también funciona si sus valores son variables en lugar de literales. Convertir un valor en un flotador es suficiente para obligar a toda la expresión a la aritmética de punto flotante.


Fixnum # to_r no se menciona aquí, se introdujo desde Ruby 1.9. Convierte Fixnum en forma racional. A continuación se presentan ejemplos de sus usos. Esto también puede dar una división exacta siempre que todos los números utilizados sean Fixnum.

a = 1.to_r #=> (1/1) a = 10.to_r #=> (10/1) a = a / 3 #=> (10/3) a = a * 3 #=> (10/1) a.to_f #=> 10.0

Ejemplo donde un flotador operado en un número racional cubre el resultado de flotar.

a = 5.to_r #=> (5/1) a = a * 5.0 #=> 25.0


Puedes comprobarlo con irb:

$ irb >> 2 / 3 => 0 >> 2.to_f / 3 => 0.666666666666667 >> 2 / 3.to_f => 0.666666666666667


Puedes incluir el módulo ruby mathn .

require ''mathn''

De esta manera, podrás hacer la división normalmente.

1/2 #=> (1/2) (1/2) ** 3 #=> (1/8) 1/3*3 #=> 1 Math.sin(1/2) #=> 0.479425538604203

De esta manera, obtiene una división exacta (clase Rational) hasta que decida aplicar una operación que no puede expresarse como una racional, por ejemplo Math.sin .


También existe el método Numeric#fdiv que puede utilizar en su lugar:

9.fdiv(5) #=> 1.8