Czasami mylą mnie typy danych Activerecord. Err, często. Jednym z moich wiecznych pytań jest, w danym przypadku,
Czy powinienem użyć
:decimal
lub:float
?
Często natrafiam na ten link, ActiveRecord:: dziesiętny vs: zmiennoprzecinkowy? , ale odpowiedzi nie są wystarczająco jasne, aby mieć pewność:
Widziałem wiele wątków, w których ludzie zalecają płaskie, aby nigdy nie używali liczb zmiennoprzecinkowych i zawsze używali liczb dziesiętnych. Widziałem także sugestie niektórych osób, aby używać pływaka tylko do zastosowań naukowych.
Oto kilka przykładowych przypadków:
- Geolokalizacja / szerokość / długość geograficzna:
-45.756688
,120.5777777
... - Stosunek / odsetek:
0.9
,1.25
,1.333
,1.4143
, ...
Używałem :decimal
w przeszłości, ale okazało się, że radzenie sobie z BigDecimal
obiektami w Ruby było niepotrzebnie niewygodne w porównaniu do float. Wiem też, że mogę :integer
na przykład przedstawiać pieniądze / centy, ale to nie pasuje do innych przypadków, na przykład gdy ilości, w których precyzja może się zmieniać w czasie.
- Jakie są zalety / wady korzystania z nich?
- Jakie byłyby pewne dobre zasady, aby wiedzieć, jakiego rodzaju użyć?
źródło
+1.43*2^10
raczej niż+1.43*10^2
?W Railsach 3.2.18: liczba dziesiętna zmienia się w: liczba całkowita podczas używania SQLServer, ale działa dobrze w SQLite. Przejście na: float rozwiązało dla nas ten problem.
Wyciągnięta lekcja brzmi: „zawsze używaj jednorodnych baz danych dotyczących programowania i wdrażania!”
źródło
W Rails 4.1.0 napotkałem problem z zapisywaniem szerokości i długości geograficznej w bazie danych MySql. Nie można zapisać dużej liczby ułamkowej przy typie danych zmiennoprzecinkowych. I zmieniam typ danych na dziesiętny i działam dla mnie.
źródło
decimal(13,9)
jest wystarczający dla szerokości i długości geograficznej. @ScottW: Nie przypominam sobie, ale jeśli Postgres używa pływaków IEEE, „działa dobrze”, ponieważ nie napotkałeś problemów… JESZCZE. Jest to niewystarczający format dla szerokości i długości geograficznej. W końcu będziesz mieć błędy w najmniej znaczących cyfrach.