Galleggiante arrotondato in rubino


150

Sto riscontrando problemi di arrotondamento. Ho un galleggiante, che voglio arrotondare al centesimo di un decimale. Tuttavia, posso solo usare ciò .roundche fondamentalmente lo trasforma in un int, ovvero 2.34.round # => 2. c'è un modo semplice per fare qualcosa del genere2.3465 # => 2.35

Risposte:


181

Durante la visualizzazione, è possibile utilizzare (ad esempio)

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

Se si desidera archiviarlo arrotondato, è possibile utilizzare

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

2
Grazie. Non pensavo che lo sprintf si sarebbe preso cura di arrotondare per me. sprintf '%.2f', 2.3465funziona anche.
Noah Sussman,

66
value.round (2) è meglio di questa soluzione
Kit Ho

12
Tieni presente che 2.3000.round(2) => 2.3e sprintf '%.2f', 2.300 => 2.30. Secondo me questo è un difetto in round (), o dovrebbe avere un'opzione per preservare gli zeri finali.
Excalibur,

14
@Excalibur 2.3000.round(2)è un numero, non una stringa. Non c'è modo in cui il numero 2.3sia diverso 2.30, quindi non c'è modo di avere un'opzione per conservare gli zeri finali. Potresti creare la tua classe di numeri_con_significanza ma poi abbiamo già delle stringhe.
Roobie Nuby,

6
Si noti che anche se questo fa lavoro per due cifre decimali, c'è un difetto nel '%.3f' % 1.2345(3 posti decimali, non 2), tuttavia !! Lo stesso vale per sprintf. Attenzione. Ciò => 1.234 non tornerà => 1.235come la maggior parte si aspetterebbe (iow, dopo il 2o decimale, lo sprintf arrotonda 5 in giù e arrotonda solo 6 in su). Ecco perché il commento di Kit Ho sopra ha più di 25 voti. Più sicuro da usare, '%.3f' % 1.2345.round(3)quindi il numero viene correttamente arrotondato per .roundprimo, quindi formattato (con zeri finali, se necessario).
likethesky,

392

Passa un argomento a round contenente il numero di cifre decimali a cui arrotondare

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

8
Ciò sembrerebbe più sensato che moltiplicarsi, arrotondare e dividere. +1
Segna Embling il

3
Hmm questo metodo non sembra essere in rubino 1.8.7. Forse in 1.9?
Brian Armstrong,

2
@ Brian. Questo è sicuramente in 1.9 ed è anche in binari (che questa domanda è stata taggata con)
Steve Weet,

3
Il metodo round di Ruby 1.8.7 non ha questa capacità, l'aggiunta del parametro decimale per arrotondare la posizione è un'abilità 1.9
bobmagoo

1
Si noti che non si ottengono zeri finali con questo, quindi 1.1.round(2)=> 1.1non1.10
NotAnAmbiTurner

9

puoi usarlo per arrotondare a 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          

7

È possibile aggiungere un metodo in classe Float, ho imparato questo da 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

Puoi anche fornire un numero negativo come argomento al roundmetodo da arrotondare al multiplo più vicino di 10, 100 e così via.

# 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

Se hai solo bisogno di visualizzarlo, userei l' helper number_with_precision . Se ne avessi bisogno da qualche altra parte, userei il roundmetodo , come ha sottolineato Steve Weet


1
Si noti che number_with_precisionè il metodo solo Rails.
Smar,

0

Per ruby ​​1.8.7 è possibile aggiungere quanto segue al codice:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.