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