2009-08-28 3 views

risposta

20

Controlla questo collegamento, penso che sia quello che ti serve. Ruby rounding

class Float 
    def round_to(x) 
    (self * 10**x).round.to_f/10**x 
    end 

    def ceil_to(x) 
    (self * 10**x).ceil.to_f/10**x 
    end 

    def floor_to(x) 
    (self * 10**x).floor.to_f/10**x 
    end 
end 
+0

Grazie per il link! i metodi funzionano perfettamente. – dotty

+8

Bel collegamento. La risposta sarebbe meglio con un sommario, tuttavia, in modo che possa stare in piedi da sola, specialmente dal momento che il codice collegato non fa esattamente quello che l'OP chiede, vale a dire, arrotondando allo 0,05 più vicino, ma arrotondando a una cifra decimale specifica. – tvanfosson

+3

E peggio, b/c il post in realtà reimplementa la funzione di rubino incorporata round (numero di decimali), è una cattiva idea. – Rob

21
[2.36363636363636, 4.567563, 1.23456646544846, 10.5857447736].map do |x| 
    (x*20).round/20.0 
end 
#=> [2.35, 4.55, 1.25, 10.6] 
+0

Darn, mi hai battuto di me un paio di secondi! +1 da parte mia, anche se avevo in mente una versione leggermente diversa. – Swanand

+0

Questo non arrotonda fino al più vicino 0.05 come richiesto da OP, 2.36 .... dovrebbe essere 2.40, non 2.35. –

+1

@ChristopherMaujean Vero, ma (nonostante il titolo) non è quello che l'OP chiedeva. Il corpo della domanda dice "arrotondare questi numeri (** o giù **) al ** più vicino ** 0,05". Ad ogni modo, se vuoi arrotondare, usa 'ceil' invece di' round'. – sepp2k

18

In generale l'algoritmo di “arrotondamento alla x” è:

round(x/precision)) * precision 

volte è meglio moltiplicare per 1/precision perché è un numero intero (e quindi funziona un po 'più veloce):

round(x * (1/precision))/(1/precision) 

Nel tuo caso, che sarebbe:

round(x * (1/0.05))/(1/0.05) 

che sarebbe valutato come:

round(x * 20)/20; 

non so alcun Python, però, così la sintassi potrebbe non essere corretto, ma sono sicuro puoi capirlo.

+1

Per ottenere i decimali dividere per 20.0 -> round (x * 20)/20.0; – Irukandji

+3

Per rubino: '(7.125 * 20) .round/20.0 => 7.15' –

8

Ecco una funzione generale che arrotonda per un dato valore di passo:

posto in lib:

lib/rounding.rb 
class Numeric 
    # round a given number to the nearest step 
    def round_by(increment) 
    (self/increment).round * increment 
    end 
end 

e la specifica:

require 'rounding' 
describe 'nearest increment by 0.5' do 
    {0=>0.0,0.5=>0.5,0.60=>0.5,0.75=>1.0, 1.0=>1.0, 1.25=>1.5, 1.5=>1.5}.each_pair do |val, rounded_val| 
    it "#{val}.round_by(0.5) ==#{rounded_val}" do val.round_by(0.5).should == rounded_val end 
    end 
end 

ed uso:

require 'rounding' 
2.36363636363636.round_by(0.05) 

hth.

11

meno preciso, ma questo metodo è quello che la maggior parte delle persone sono Googling questa pagina per

(5.65235534).round(2) 
#=> 5.65 
+1

5.6355.round (2)! = 5.65, ma TS vuole 5.65 –

+0

Questa soluzione arrotonda il numero solo a due cifre decimali, non restituisce un arrotondato al valore più vicino a 0,05 come richiesto. –

+0

in qualche modo hai ragione, dovrei cancellare questa risposta. Ma ad un altro livello questa è una domanda molto popolare a cui viene collegato nelle ricerche in cui le persone trovano utile questa risposta, quindi lo terrò visibile –

4

E 'possibile arrotondare i numeri con il metodo %String della classe.

Ad esempio

"%.2f" % 5.555555555 

darebbe come risultato "5.56" (una stringa).

2

Per ottenere un risultato di arrotondamento senza decimali, utilizzare Float's .round

5.44.round 
=> 5 

5.54.round 
=> 6 
3

Ruby 2 ora ha una funzione round:

# Ruby 2.3 
(2.5).round 
3 

# Ruby 2.4 
(2.5).round 
2 

Ci sono anche opzioni in rubino 2.4 come: :even, :up e :down e.g;

(4.5).round(half: :up) 
5