2012-09-13 15 views

Odpowiedz

7

Nie jestem pewien, czy to jest najprostszym sposobem, aby to zrobić - ale można po prostu podzielić liczbę używając „” charakter - tak:

number = 1.23 
parts = number.to_s.split(".") 
result = parts.count > 1 ? parts[1].to_s : 0 
+0

, która działa! dzięki EfratBlaier. – yagmurdursun

+3

Przyszli czytelnicy, proszę nie używać tego podejścia. Może działać w uproszczonym przypadku, ale potknie się w każdym locale-świadomy scenariusz. Chociaż nie jest to bardzo podatne na błędy w Rubim, które koduje '.' jako separator zmiennoprzecinkowy, promowałoby to zły nawyk, aby używać go z innymi, mniej wyrozumiałymi językami.Proszę używać funkcji matematycznych do operacji matematycznych, patrz odpowiedzi poniżej. –

37

spróbować użyć metody modulo:

1.23.modulo(1) => 0.23 

Czytaj więcej: http://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo

Albo można przekonwertować pływaka do liczby całkowitej i odjąć go od pierwotnej wartości pływaka .

1.23 - 1.23.to_i => 0.23 
+0

dzięki Eugene, spróbowałem też. – yagmurdursun

+3

Otrzymuję '(1.1) .modulo (1) # 0.10000000000000009' który jest mniejszy niż dopuszczalny! –

+0

I otrzymuję 1.234 - 1.234.to_i # 0.2399999999999999, co jest mniej niż dopuszczalne. Jest to typowe dla arytmetyki zmiennoprzecinkowej. Czy sposób EfratBlaier jest najlepszy? – labyrinth

1
a=1.23 #value of a will be 1.23 
a=a-a.to_i #value of a will be 0.23 
2

jeśli wiesz żądaną dokładność, to może być odrobinę szybsze rozwiązanie to_s.

1.1234.modulo(1).round(4) #0.1234 
2

Wybór odpowiedniego rozwiązania wymaga zrozumienia typu, z którym pracuje użytkownik. Jeśli twoje wartości są zmiennoprzecinkowe (standardowy typ dla liczb niecałkowitych w Ruby), to logicznie poprawne odpowiedzi, takie jak mod(1), mogą powodować nieoczekiwane wyniki z powodu floating point errors. W każdym przypadku, w którym Float jest właściwym typem danych, którego należy użyć, jest to prawdopodobnie akceptowalne.

Jeśli błędy zmiennoprzecinkowe są , a nie dopuszczalne, nie należy używać Float! Ruby posiada świetną klasę BigDecimal, która jest znacznie dokładniejsza kosztem wydajności i nieco bardziej szczegółowej składni.

decimal = BigDecimal.new("1.23") 
decimal.fraC#=> 0.23 
0

Po wypróbowaniu wszystkiego ... Czuję najlepszą odpowiedzią jest (num - num.to_i).abs ponieważ działa również dla liczb ujemnych.

np.

(1,23 - 1.23.to_i) nazwa.abs = 0,23

(-1.23 - -1.23.to_i) nazwa.abs = 0,23

Powiązane problemy