2010-01-13 7 views
125

J'ai des problèmes d'arrondi. J'ai un flotteur, que je veux arrondir au centième d'une décimale. Cependant, je ne peux pas utiliser .round qui transforme essentiellement en un int, ce qui signifie 2.34.round # => 2. est-il un moyen simple effet de faire quelque chose comme 2.3465 # => 2.35Flotteur arrondi en Ruby

+1

'2.3465.round (2) => 2.35' – Magne

Répondre

159

Lors de l'affichage, vous pouvez utiliser (par exemple)

>> '%.2f' % 2.3465 
=> "2.35" 

Si vous voulez stocker arrondi, vous pouvez utiliser

>> (2.3465*100).round/100.0 
=> 2.35 
+0

grande réponse merci, je savais qu'il y avait un moyen simple de faire il. – user211662

+2

Merci. Je ne me suis pas rendu compte que sprintf prendrait soin d'arrondir pour moi. 'sprintf '% .2f', 2.3465' fonctionne également. –

+46

value.round (2) est meilleur que cette solution –

358

Passer un argument pour arrondir contenant le nombre de décimales à arrondir

>> 2.3465.round 
=> 2 
>> 2.3465.round(2) 
=> 2.35 
>> 2.3465.round(3) 
=> 2.347 
+7

Cela semblerait plus judicieux que de multiplier, arrondir et diviser. +1 –

+3

Hmm cette méthode ne semble pas être en rubis 1.8.7. Peut-être en 1.9? –

+2

@Brian. Ceci est certainement dans 1.9 et est également dans les rails (Avec laquelle cette question a été taguée) –

6

Vous pouvez ajouter une méthode dans la classe de flotteur, je l'ai appris de stackoverflow:

class Float 
    def precision(p) 
     # Make sure the precision level is actually an integer and > 0 
     raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0 
     # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0 
     return self.round if p == 0 
     # Standard case 
     return (self * 10**p).round.to_f/10**p 
    end 
end 
3
def rounding(float,precision) 
    return ((float * 10**precision).round.to_f)/(10**precision) 
end 
0

Pour ruby ​​1.8.7, vous pouvez ajouter ce qui suit à votre code:

class Float 
    alias oldround:round 
    def round(precision = nil) 
     if precision.nil? 
      return self 
     else 
      return ((self * 10**precision).oldround.to_f)/(10**precision) 
     end 
    end 
end 
1

Si vous avez juste besoin de l'afficher, j'utiliserais l'assistant number_with_precision. Si vous avez besoin d'un autre endroit, j'utiliser, comme Steve Weet a, la méthode round

+1

Notez que 'number_with_precision' est la méthode Rails-only. – Smar

3

Vous pouvez également fournir un nombre négatif comme argument à la méthode round pour arrondir au plus proche multiple de 10, 100 et ainsi de suite .

# Round to the nearest multiple of 10. 
12.3453.round(-1)  # Output: 10 

# Round to the nearest multiple of 100. 
124.3453.round(-2)  # Output: 100 
5

vous pouvez l'utiliser pour arrondir à un precison ..

//to_f is for float 

salary= 2921.9121 
puts salary.to_f.round(2) // to 2 decimal place     

puts salary.to_f.round() // to 3 decimal place