Perché la divisione in Ruby restituisce un intero anziché il valore decimale?

Per esempio:

9 / 5 #=> 1 

ma mi aspettavo 1.8 . Come posso ottenere il risultato decimale corretto (non intero)? Perché restituisce 1 affatto?

Sta facendo divisione in interi. Puoi rendere uno dei numeri un Float aggiungendo .0 :

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

Sta facendo divisione in interi. Puoi usare to_f per forzare le cose in modalità a virgola mobile:

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

Questo funziona anche se i tuoi valori sono variabili anziché letterali. Convertire un valore in un float è sufficiente per forzare l’intera espressione all’aritmetica in virgola mobile.

C’è anche il metodo Numeric#fdiv che puoi usare invece:

 9.fdiv(5) #=> 1.8 

Puoi verificarlo con irb:

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

Puoi includere il modulo ruby mathn .

 require 'mathn' 

In questo modo, sarai in grado di fare normalmente la divisione.

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

In questo modo, si ottiene la divisione esatta (class Rational) finché non si decide di applicare un’operazione che non può essere espressa come razionale, ad esempio Math.sin .

Cambia il 5 a 5.0 . Stai diventando divisione intera.

Fixnum # to_r non è menzionato qui, è stato introdotto dal ruby ​​1.9. Converte il Fixnum in forma razionale. Di seguito sono riportati alcuni esempi dei suoi usi. Questo può anche dare una divisione precisa a patto che tutti i numeri utilizzati siano 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 

Esempio in cui un float operato su un numero razionale copre il risultato di fluttuare.

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