2010-10-01 14 views

risposta

29
class Float 
    def round_point5 
    (self * 2).round/2.0 
    end 
end 

Un classico problema: questo significa che stai facendo intero arrotondamento con una radice diversa. Puoi sostituire '2' con qualsiasi altro numero.

+0

Poiché questa soluzione aggiunge il metodo alla stessa classe Ruby, è possibile utilizzarla in questo modo: '(2.45) .round_point5' o' x.round_point5' – giraff

+0

Decimale di classe - è una cosa di Rails? E cos'è il "valore"? – steenslag

+0

woah, grazie @steenslag - ha corretto la cosa del valore che era erroneamente sbagliata. Ho anche cambiato Decimal in Float, perché mentre c'è una classe Decimal (e l'OP cita decimale nel titolo), probabilmente non è quello che intendevano ora che lo menzioni ... – Peter

11

Moltiplicare il numero per due.

rotondo a numero intero.

Dividere per due.

(x * 2.0).round/2.0 

In una forma generalizzata, si moltiplica per il numero di tacche si desidera per ogni numero intero (diciamo intorno a 0,2 è di cinque tacche per intero valore). Quindi round; quindi dividi per lo stesso valore.

(x * notches).round/notches 
+0

se si divide per 2 che troncherà a causa di divisione intera anch'io inizialmente. ha avuto questo problema nella mia soluzione :) Dividi per 2.0 invece . – Peter

+0

@Peter: Grazie! :) – JoshD

+0

@Peter Grazie. @JoshD Grazie per la spiegazione aggiunta. Ha senso. –

1

È possibile eseguire questo con un operatore modulo.

(x + (0.05 - (x % 0.05))).round(2) 

Se x = 1234.56, questo tornerà 1234,6

sono incappato in questa risposta, perché sto scrivendo una calcolatrice Ruby-based e ha usato biblioteca denaro di Ruby a che fare tutti i calcoli finanziari. Gli oggetti Ruby Money non hanno le stesse funzioni di arrotondamento di un Integer o di un Float, ma possono restituire il resto (ad es. Modulo, %).

Quindi, utilizzando Rubino denaro si può arrotondare un oggetto soldi al più vicino $ 25 con il seguente:

x + (Money.new(2500) - (x % Money.new(2500))) 

Qui, se 1.234,45 x = $ (< #Money frazionaria: 123445 Valuta: USD>), poi tornerà $ 1250,00 (#

NOTA: non c'è alcuna necessità di arrotondare con oggetti di Ruby denaro in quanto tale libreria si prende cura di esso per voi

Problemi correlati