web-dev-qa-db-fra.com

Pourquoi la division dans Ruby renvoie-t-elle un entier au lieu d'une valeur décimale?

Par exemple:

9 / 5  #=> 1

mais je m'attendais à 1.8. Comment puis-je obtenir le bon résultat décimal (non entier)? Pourquoi renvoie-t-il 1?

241
ErwinM

C’est la division entière. Vous pouvez faire l'un des nombres un Float en ajoutant .0:

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

C’est la division entière. Vous pouvez utiliser to_f pour forcer les éléments en mode virgule flottante:

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

Cela fonctionne aussi si vos valeurs sont des variables au lieu de littéraux. La conversion d'une valeur en float suffit à contraindre l'expression entière à l'arithmétique en virgule flottante.

333
mu is too short

Il existe également la méthode Numeric#fdiv que vous pouvez utiliser à la place:

_9.fdiv(5)  #=> 1.8
_
165
Konrad Reiche

Vous pouvez le vérifier avec irb:

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

Vous pouvez inclure le module Ruby mathn.

require 'mathn'

De cette façon, vous pourrez faire la division normalement.

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

De cette façon, vous obtenez une division exacte (classe Rational) jusqu'à ce que vous décidiez d'appliquer une opération qui ne peut pas être exprimée sous la forme d'un rationnel, par exemple Math.sin.

26
Rok Kralj

Changez le 5 en 5.0. Vous obtenez une division entière.

10
Tyler Eaves

Fixnum # to_r n'est pas mentionné ici, il a été introduit depuis Ruby 1.9. Il convertit Fixnum en une forme rationnelle. Vous trouverez ci-dessous des exemples d'utilisation. Cela peut aussi donner une division exacte tant que tous les nombres utilisés sont 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

Exemple dans lequel un float opéré sur un nombre rationnel recouvre le résultat en float.

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