Ruby'de yuvarlama şamandıra


150

Yuvarlama sorunları yaşıyorum. Ondalık bir sayının yüzde biri kadar yuvarlamak istediğim bir şamandıra var. Ancak, sadece .roundtemelde bir int haline dönüştüren kullanabilirsiniz , yani 2.34.round # => 2. Gibi bir şey yapmanın basit bir etki yolu var mı2.3465 # => 2.35

Yanıtlar:


181

Görüntülemek için aşağıdakileri kullanabilirsiniz (örneğin)

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

Yuvarlatılmış olarak saklamak istiyorsanız,

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

2
Teşekkürler. Sprintf'in benim için yuvarlamaya dikkat edeceğini bilmiyordum. sprintf '%.2f', 2.3465ayrıca çalışır.
Noah Sussman

66
value.round (2) bu çözümden daha iyidir
Kit Ho

12
Unutmayın 2.3000.round(2) => 2.3ve sprintf '%.2f', 2.300 => 2.30. Bence bu turdaki bir kusurdur (), ya da sıfırları korumak için bir seçeneği olmalıdır.
Excalibur

14
@Excalibur 2.3000.round(2)bir dize değil bir sayıdır. Sayının 2.3farklı 2.30olmasının bir yolu yoktur, bu nedenle sondaki sıfırları koruma seçeneğine sahip olmanın bir yolu yoktur. Kendi numbers_with_significance sınıfınızı yapabilirsiniz, ancak zaten dizelerimiz var.
Roobie Nuby

6
Not Bu her ne kadar o yapar iki ondalık basamağa için işi, bir kusur var '%.3f' % 1.2345(3 ondalık basamağa değil 2) Ancak !! Aynı şey sprintf. Dikkat. Yani dönecektir => 1.234 değil => 1.235 (2 ondalık, sprintf mermi 5 sonra, IOW gibi en beklenebilir aşağı ve sadece 6 yukarı yuvarlar). Bu yüzden Kit Ho'nun yukarıdaki yorumu 25+ yukarı oy veriyor. Kullanımı daha güvenlidir, '%.3f' % 1.2345.round(3)bu nedenle numara .roundönce yuvarlanır , daha sonra biçimlendirilir (gerekirse sondaki sıfırlarla).
likethesky

392

Yuvarlanacak ondalık basamak sayısını içeren raya bağımsız değişken iletme

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

8
Bu çarpma, yuvarlama ve bölmekten daha mantıklı görünebilir. +1
Mark Embling

3
Hmm bu yöntem yakut 1.8.7'de görünmüyor. Belki 1.9'da?
Brian Armstrong

2
@Brian. Bu kesinlikle 1.9 ve aynı zamanda raylar (Bu soru ile etiketlendi)
Steve Weet

3
Ruby 1.8.7'in yuvarlak yöntemi bu yeteneğe sahip değil, ondalık basamak yuvarlama parametresini eklemek 1.9 yetenektir
bobmagoo

1
Bununla takip eden sıfırlar alamayacağınızı unutmayın, bu yüzden 1.1.round(2)=> 1.1değil1.10
NotAnAmbiTurner

9

bunu bir önermeye yuvarlamak için kullanabilirsiniz ..

//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

Float Class'ta bir yöntem ekleyebilirsiniz, bunu stackoverflow'dan öğrendim:

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

Ayrıca round, en yakın 10, 100 katına yuvarlama yöntemine argüman olarak negatif bir sayı da sağlayabilirsiniz .

# 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

Sadece görüntülemeniz gerekiyorsa, number_with_precision yardımcısını kullanırdım. Steve Weet'in işaret ettiği gibi, başka bir yerde kullanacağım roundyöntem


1
number_with_precisionYalnızca Rails yöntemi olduğunu unutmayın .
Smar

0

Ruby 1.8.7 için kodunuza aşağıdakileri ekleyebilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.