Zaokrąglanie pływaka w Rubim

150

Mam problemy z zaokrągleniem. Mam liczbę zmiennoprzecinkową, którą chcę zaokrąglić do setnej części dziesiętnej. Jednak mogę użyć tylko tego, .roundco w zasadzie zamienia go w int, co oznacza, 2.34.round # => 2. czy istnieje prosty sposób na wykonanie czegoś takiego2.3465 # => 2.35

user211662
źródło

Odpowiedzi:

181

Podczas wyświetlania możesz użyć (na przykład)

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

Jeśli chcesz, aby były zaokrąglane, możesz użyć

>> (2.3465*100).round / 100.0
=> 2.35
Piotr
źródło
2
Dzięki. Nie wiedziałem, że sprintf zajmie się za mnie zaokrąglaniem. sprintf '%.2f', 2.3465również działa.
Noah Sussman
66
value.round (2) jest lepsze niż to rozwiązanie
Kit Ho
12
Pamiętaj, że 2.3000.round(2) => 2.3i sprintf '%.2f', 2.300 => 2.30. Moim zdaniem jest to błąd w round () lub powinien mieć opcję zachowania końcowych zer.
Excalibur,
14
@Excalibur 2.3000.round(2)to liczba, a nie ciąg. Nie ma możliwości, aby liczba 2.3była inna niż 2.30, więc nie ma możliwości zachowania zer kończących. Możesz stworzyć własną klasę liczb_z_znaczeniem, ale wtedy mamy już łańcuchy.
Roobie Nuby
6
Należy zauważyć, że chociaż to robi pracę dla dwóch miejsc po przecinku, jest to wada '%.3f' % 1.2345(3 miejsc po przecinku, a nie 2), jednak !! Sama dla sprintfjak dobrze. Strzec się. To nie wróci => 1.234 tak, => 1.235 jak większość by się spodziewała (iow, po drugim miejscu po przecinku sprint zaokrągla 5 w dół i tylko zaokrągla 6 w górę). Dlatego powyższy komentarz Kit Ho ma ponad 25 głosów za. Bezpieczniejsze w użyciu, '%.3f' % 1.2345.round(3)więc liczba jest odpowiednio zaokrąglana przez .roundpierwsze, a następnie formatowana (w razie potrzeby z końcowymi zerami).
likethesky
392

Przekaż argument do round zawierający liczbę miejsc dziesiętnych do zaokrąglenia

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
Steve Weet
źródło
8
Wydawałoby się to rozsądniejsze niż mnożenie, zaokrąglanie i dzielenie. +1
Mark Embling
3
Hmm, ta metoda nie wydaje się być w Ruby 1.8.7. Może w 1.9?
Brian Armstrong,
2
@Brian. Jest to z pewnością w 1,9 i jest także w szynach (Który to pytanie zostało oznaczone tagiem)
Steve Weet
3
Metoda round w Rubim 1.8.7 nie ma tej możliwości, dodanie parametru zaokrąglania miejsc po przecinku to umiejętność 1,9
bobmagoo
1
Zauważ, że nie dostajesz w tym końcowych zer, więc 1.1.round(2)=> 1.1nie1.10
NotAnAmbiTurner
9

możesz użyć tego do zaokrąglenia do dokładności.

//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          
tech bułka
źródło
7

Możesz dodać metodę w Float Class, nauczyłem się tego ze 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
Albert Català
źródło
3

Możesz również podać liczbę ujemną jako argument roundmetody, aby zaokrąglić ją do najbliższej wielokrotności liczby 10, 100 i tak dalej.

# 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
BrunoFacca
źródło
2
def rounding(float,precision)
    return ((float * 10**precision).round.to_f) / (10**precision)
end
PeteJLeonard
źródło
2

o czym (2.3465*100).round()/100.0?

thenoviceoof
źródło
1

Jeśli chcesz go tylko wyświetlić, użyłbym pomocnika number_with_precision . Jeśli potrzebujesz go gdzie indziej, użyłbym, jak wskazał Steve Weet, roundmetody

Fer
źródło
1
Zauważ, że number_with_precisionjest to metoda tylko dla Railsów.
Smar
0

Dla ruby ​​1.8.7 możesz dodać do swojego kodu:

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
Robert
źródło