Mam pole ceny/kolumna (np. 15.50 USD) i zastanawiam się, czy typ Railsowy powinien być łańcuchowy, dziesiętny czy zmiennoprzecinkowy?Typ danych łańcuchowy, dziesiętny lub zmiennoprzecinkowy dla pola cenowego?
Odpowiedz
Ten argument ma zawsze dwie strony - dziesiętne i całkowite. Zwolennicy liczb całkowitych twierdzą, że wartości dziesiętne mogą być niedokładne (podczas konwersji), a implementacja BigDecimal obejmuje błędy, a czasem nawet błędy w segfault.
Dla mojego własnego projektu wziąłem również liczby całkowite, opakowałem je w niestandardowy pojemnik, przeliczając centy na "rzeczywiste" kwoty iz powrotem. Na początku wydawało się to przyjemne, po pewnym czasie stało się naprawdę niewygodne w użyciu - śledzenie, gdy masz do czynienia z centami, kiedy z sformatowanymi ciągami itp.
Potem wróciłem do wartości dziesiętnych - ten sam format cały czas, mogę łatwo przekonwertować Kwota do centów w razie potrzeby, otrzymuję różne algorytmy zaokrągleń po wyjęciu z pudełka. Jestem o wiele bardziej zadowolony z miejsc dziesiętnych.
A problemy z dziesiętnymi nie są dokładne - podczas korzystania z wyszukiwarki można zauważyć, że większość błędów wiąże się z przekształcaniem miejsc po przecinku w znaki pływające :) Jak już wspomniano wcześniej, przepływy nie są dokładne i nigdy nie powinieneś zamień swój dziesiętny na zmiennoprzecinkowy. To najważniejsza rzecz, o której musisz pamiętać w przypadku miejsc dziesiętnych - nie chcesz tracić dokładności przez konwersje. Och, i nigdy nie spotkałem się z żadnymi błędami z ruby 1.8.7, 1.8.7 i 1.9.1 podczas intensywnego korzystania z BigDecimal.
To zależy.
Jeśli wykonujesz obliczenia cen zakupu, użyj wartości dziesiętnych.
Jeśli wykonujesz matematykę inżynieryjną, użyj float.
Jeśli tylko przechowujesz dane, użyj ciągu znaków.
add_column :table, :price, :decimal, :precision => 8, :scale => 2
Powyższy kod będzie najlepszym wyborem.
Jak to zrobić w linii poleceń? wpisałem "szyny generują rusztowanie Cena produktu: dziesiętna" i utworzyłem kolumnę z: skalą 1. –
W zależności od potrzeb, możesz dodać -> kolumna dodawania: tabela,: waluta,: ciąg,: domyślnie => 'USD ' – Tom
Czy to jest Rails 3? rails g migration Cena AddPriceToYourModel: decimal, następnie przejdź do wygenerowanej migracji i dodaj szczegóły. – Tom
Polecam używanie liczb całkowitych do ceny, jeśli to możliwe. Wiele popularnych klejnotów (takich jak ActiveMerchant, Money) zakłada użycie liczb całkowitych i często lepiej jest przechowywać jednostki miary w jednostce podstawowej (np. Centach).
, ale liczby całkowite nie mają wartości 13,25? –
Dlatego opieracie się na centach. Zatem 13,25 USD zostaje zapisany jako 1325 w bazie danych. W widoku formatujesz znak dolara i dziesiętny. – sosborn
O ile oczywiście nie obliczysz ceny czegoś, co wykorzystuje ułamki centa, na przykład ceny gazu. Następnie powinieneś mieć dwa pola - jeden do przechowywania frakcji jako liczby całkowitej i drugi do informowania, ile miejsc dziesiętnych powinien mieć pierwszy numer i ... o, czekaj, że to idiotyzm, po prostu użyj liczby dziesiętnej :) – MikeJ
pływaków nie są dokładne:
0.3 - 0.2 - 0.1
=> -2.77555756156289e-17
Nie stosować je chyba przechowywać tylko wartości.
Jeśli chcesz wykonać obliczenia, zapisz cenę w centach jako liczbę całkowitą. Możesz łatwo wyświetlać je jako USD za pomocnika.
omg to naprawdę dzieje się. – jturolla
to tylko rzecz prekursorska. Nie ma nic złego w wartości. To -2,7 * 10^-17 jest bardzo bliskie zeru –
- 1. Konwertuj IEEE 754 na dziesiętny zmiennoprzecinkowy
- 2. Jak wysłać kod USSD zawierający dziesiętny zmiennoprzecinkowy (.)?
- 3. Czy istnieje typ danych "dziesiętny" w R?
- 4. Typ danych pola PostgreSQL dla adresów IPv4
- 5. Algorytm dla schematu cenowego Fogbugz
- 6. Jak przekonwertować frakturę sformatowaną na ułamek dziesiętny lub zmiennoprzecinkowy w języku Java?
- 7. Logstash/ElasticSearch: zgaduje niewłaściwy typ danych dla pola
- 8. Znajdź typ danych pola z obiektu DataReader
- 9. nieobsługiwany typ (y) argumentu dla *: 'float' i 'Dziesiętny'
- 10. Dane podstawowe - rodzaj dziesiętny dla waluty
- 11. typ pola dla znacznika czasu unixowego
- 12. Typ pola PostgreSQL dla znacznika czasu unix?
- 13. Jaki jest najlepszy typ danych dla walut w MySQL?
- 14. Konstruktor łańcuchowy przekazujący obliczone wartości dla parametrów
- 15. MySQL zwraca kolumna typ dziesiętny lub bigint gdy uruchamiam „Wybierz 0 AS COL ..”
- 16. Najlepszy typ dla danych UTF-8?
- 17. MySQL: Najmniejszy typ danych dla jednego bitu
- 18. Mając szorstka razem zdecydowaliśmy się na float, double, lub DZIESIĘTNY
- 19. Extend Sitecore WFFM typ pola
- 20. Tworzenie "Ajaxified" Typ pola formularza
- 21. Jak zaktualizować elasticsearch typ pola
- 22. Jak wyodrębnić typ z pola?
- 23. Czym dokładnie jest tekst zmiennoprzecinkowy?
- 24. Numer zmiennoprzecinkowy w formacie
- 25. Struktura danych dla gier Kropki i pola
- 26. undefined indeks dla pola bazy danych
- 27. Wyłącz sprawdzanie danych wejściowych dla pojedynczego pola
- 28. stałej szerokości zmiennoprzecinkowy format numeru
- 29. Typ danych dla waluty używającej Mongoida
- 30. Typ danych dla System.Version w serwerze sql
+1 "nigdy nie konwertuj swojej wartości dziesiętnej na liczbę zmiennoprzecinkową" ... zdarzają się dziwne rzeczy – tybro0103