web-dev-qa-db-fra.com

Arrondir le flottant dans Ruby

J'ai des problèmes d'arrondi. J'ai un flotteur que je veux arrondir au centième de décimale. Cependant, je ne peux utiliser que .round qui le transforme en un int, ce qui signifie 2.34.round # => 2. Existe-t-il un moyen simple d’utiliser un effet comme 2.3465 # => 2.35

145
user211662

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

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

Si vous voulez le stocker arrondi, vous pouvez utiliser

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

Passer 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
382
Steve Weet

vous pouvez l'utiliser pour arrondir avec 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
tech bun

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
7
Albert Català

Vous pouvez également fournir un nombre négatif en tant qu'argument à la méthode round pour arrondir au multiple le plus proche de 10, 100, etc.

# 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
3
BrunoFacca

qu'en est-il de (2.3465*100).round()/100.0?

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

Si vous avez juste besoin de l'afficher, j'utiliserais l'aide number_with_precision . Si vous en avez besoin quelque part, j'utiliserais, comme l'a souligné Steve Weet, la méthode round

1
Fer

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
0
Robert