Flotteur arrondi en rubis


150

J'ai du mal à arrondir. J'ai un flotteur, que je veux arrondir au centième de décimale. Cependant, je ne peux utiliser .roundque ce qui le transforme en un int, ce qui signifie 2.34.round # => 2. existe-t-il un moyen d'effet simple de faire quelque chose comme2.3465 # => 2.35

Réponses:


181

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

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

Si vous souhaitez le stocker arrondi, vous pouvez utiliser

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

2
Merci. Je n'avais pas réalisé que sprintf s'occuperait d'arrondir pour moi. sprintf '%.2f', 2.3465fonctionne également.
Noah Sussman

66
value.round (2) est meilleur que cette solution
Kit Ho

12
Gardez à l'esprit que 2.3000.round(2) => 2.3et sprintf '%.2f', 2.300 => 2.30. À mon avis, c'est une faille dans round (), ou il devrait avoir une option pour conserver les zéros de fin.
Excalibur

14
@Excalibur 2.3000.round(2)est un nombre, pas une chaîne. Il n'y a aucun moyen que le nombre 2.3soit différent de 2.30, il n'y a donc aucun moyen d'avoir une option pour conserver les zéros de fin. Vous pouvez créer votre propre classe de nombres_avec_signifiance, mais nous avons déjà des chaînes.
Roobie Nuby

6
Notez que bien que cela ne travail pour deux décimales, il y a une faille dans '%.3f' % 1.2345(3 décimales, pas 2), cependant !! Idem pour sprintfaussi. Il faut se méfier. Cela ne reviendra => 1.234 pas => 1.235 comme la plupart des gens s'y attendraient (iow, après la 2ème décimale, sprintf arrondit 5 vers le bas et arrondit seulement un 6 vers le haut). C'est pourquoi le commentaire de Kit Ho ci-dessus a plus de 25 votes positifs. Plus sûr à utiliser, '%.3f' % 1.2345.round(3)le nombre est donc correctement arrondi en .roundpremier, puis formaté (avec des zéros à la fin, si nécessaire).
likethesky

392

Passez un argument à arrondir contenant le nombre de décimales à arrondir

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

8
Cela semblerait plus judicieux que de multiplier, d'arrondir et de diviser. +1
Mark Embling

3
Hmm cette méthode ne semble pas être dans ruby ​​1.8.7. Peut-être en 1.9?
Brian Armstrong

2
@Brian. C'est définitivement en 1.9 et aussi dans les rails (avec lesquels cette question a été taguée)
Steve Weet

3
La méthode ronde de Ruby 1.8.7 n'a pas cette capacité, l'ajout du paramètre d'arrondi de la décimale est une capacité 1.9
bobmagoo

1
Notez que vous n'obtenez pas de zéros de fin avec ceci, donc 1.1.round(2)=> 1.1pas1.10
NotAnAmbiTurner

9

vous pouvez l'utiliser pour arrondir à une précision.

//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          

7

Vous pouvez ajouter une méthode dans Float Class, j'ai appris cela 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

Vous pouvez également fournir un nombre négatif comme argument à la roundméthode pour arrondir au multiple le plus proche 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

2
def rounding(float,precision)
    return ((float * 10**precision).round.to_f) / (10**precision)
end


1

Si vous avez juste besoin de l'afficher, j'utiliserais l' assistant number_with_precision . Si vous en avez besoin ailleurs, j'utiliserais, comme l'a souligné Steve Weet, la roundméthode


1
Notez que number_with_precisionc'est la méthode Rails uniquement.
Smar

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.