2010-10-01 15 views
17

To wydaje się okropne nieefektywne. Czy ktoś może mi dać lepszy sposób na Ruby?Lepsza implementacja Ruby rundy dziesiętnej do najbliższej 0.5

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 

Odpowiedz

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

Klasycznym problemem: oznacza to robisz całkowitą zaokrąglania z innym radix. Możesz zamienić "2" na dowolny inny numer.

+0

Ponieważ to rozwiązanie dodaje metodę do samej klasy Ruby, możesz jej użyć w następujący sposób: '(2.45) .round_point5' lub' x.round_point5' – giraff

+0

klasa dziesiętna - czy to coś z Railsów? A czym jest "wartość"? – steenslag

+0

Woah, dzięki @steenslag - naprawiono wartość rzeczy, która była rażąco błędna. Zmieniłem także wartość dziesiętną na zmienną, ponieważ podczas gdy istnieje klasa dziesiętna (i OP wymienia dziesiętny w tytule), to prawdopodobnie nie jest to, co mieli na myśli teraz, kiedy o tym wspomniałeś ... – Peter

11

Pomnóż liczbę przez dwa.

zaokrąglone do liczby całkowitej.

Podziel przez dwa.

(x * 2.0).round/2.0 

W uogólnionej formie, należy pomnożyć przez liczbę nacięć chcesz za liczby całkowitej (słownie okrągły do ​​.2 jest pięć karby na całej wartości). Następnie okrągłe; następnie podziel według tej samej wartości.

(x * notches).round/notches 
+0

jeśli podzielić przez 2 będzie obciąć ze względu na liczbę całkowitą podział ja też początkowo. miał ten problem w moim rozwiązaniu :) Podziel zamiast tego na 2,0 . – Peter

+0

@Peter: Dzięki! :) – JoshD

+0

@Peter Dzięki. @JoshD Dzięki za dodatkowe wyjaśnienie. Ma sens. –

1

Można tego dokonać również za pomocą operatora modulo.

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

jeśli x = 1234.56, to powróci 1234,6

natknąłem się tej odpowiedzi, bo piszę Ruby kalkulatora opartego a kiedyś bibliotekę pieniądze Ruby zrobić wszystkie obliczenia finansowe. Obiekty Ruby Money nie mają tych samych funkcji zaokrąglania, co Integer lub Float, ale mogą zwrócić pozostałą część (np. Modulo, %).

Stąd przy użyciu Ruby pieniądze można zaokrąglić obiekt pieniądze na najbliższe 25 $ z następujących czynności:

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

Tutaj, jeśli x = $ +1234,45 (< #Money frakcyjny: 123445 Waluta: USD>), następnie powróci $ 1250,00 (#

UWAGA: nie ma potrzeby, aby zaokrąglić z obiektami Ruby pieniądze ponieważ biblioteka dba o to dla ciebie

Powiązane problemy