2010-10-01 12 views
17

Bu, korkunç verimsiz görünüyor. Birisi bana daha iyi bir Ruby yolu verebilir.Yuvarlak ondalık en iyi Ruby uygulamasının en yakın 0,575

def round_value 
    x = (self.value*10).round/10.0 # rounds to two decimal places 
    r = x.modulo(x.floor) # finds remainder 
    f = x.floor 

    self.value = case 
    when r.between?(0, 0.25) 
    f 
    when r.between?(0.26, 0.75) 
    f+0.5 
    when r.between?(0.76, 0.99) 
    f+1.0 
    end 
end 

cevap

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

Klasik bir sorun: Bu farklı bir radix ile yuvarlama tamsayı yapıyoruz demektir. '2'yi başka bir numarayla değiştirebilirsiniz.

+0

Bu çözüm yöntemi Ruby-Class'ın kendisine ekledikçe, aşağıdaki gibi kullanabilirsiniz: '(2.45) .round_point5' veya' x.round_point5' – giraff

+0

sınıfı Ondalık - bu bir Rails şey mi? Ve 'değer' nedir? – steenslag

+0

woah, teşekkürler @steenslag - blatently yanlış olan değer şey düzeltildi. Aynı zamanda Ondalık Sınıfı'nı da değiştirdim, çünkü bir Ondalık sınıfı varken (ve OP'de ondalıktan bahsediyorsa), muhtemelen bundan bahsettiğiniz şeyden değilsiniz ... – Peter

11

Sayıyı iki ile çarpın. Tüm numaraya yuvarlamak için

.

İkiye bölün. genelleştirilmiş bir formda

(x * 2.0).round/2.0 

, sen çarpın çentik sayısına göre size tam sayıya başına (diyelim yuvarlak .2 bütün değer başına beş kademe üzerindedir) istiyorum. Sonra yuvarlak; daha sonra aynı değere bölün.

(x * notches).round/notches 
+0

bunu bölünme tamsayı nedeniyle keser 2'ye bölün eğer I de başlangıçta. benim çözümümde bu sorunu vardı :) yerine 2.0 ile bölün . – Peter

+0

@Peter: Teşekkürler! :) – JoshD

+0

@Peter Teşekkürler. @JoshD Eklenen açıklama için teşekkürler. Mantıklı. –

1

Bunu bir modulo operatörüyle de yapabilirsiniz. Ben Ruby tabanlı hesap makinesi yazıyorum çünkü bu cevap tökezledi ve tüm finansal hesaplamaları yapmak için Ruby'nin Para kütüphanesini kullanılan 1234,6

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

x = 1234,56, bu dönecektir. Ruby Money nesneleri, bir Tamsayı veya Float'ın yaptığı aynı yuvarlama işlevlerine sahip değildir, ancak kalanını döndürür (örneğin, modulo, %). Yakut Para kullanılarak Dolayısıyla

, aşağıdaki ile en yakın 25 $ için bir para nesnesini tamamlayabilirler: o zaman (: 123.445 döviz USD> < #Money fraksiyonel),

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

Burada, x = $ 1.234,45 eğer o $ 1250,00 (#

NOT döndürür:! o kütüphane senin için bunu halleder beri Yakut Para nesnelerle yuvarlamak için gerek yok