Potrzebuję przechowywać kilka pól związanych z pieniędzmi w bazie danych, ale nie jestem pewien, jakiego typu danych użyć między pieniądze i dziesiętna.Jaki jest najlepszy sposób na przechowywanie wartości pieniężnej w bazie danych?
Odpowiedz
Dziesiętny i pieniądze powinny być dość wiarygodne. To, co mogę zapewnić (z bolesnego osobistego doświadczenia z odziedziczonych aplikacji) to: NIE UŻYWAJ PŁASZCZA!
Chyba sprowadza się do precyzji i skali. IIRC, money
to 4dp. Jeśli to w porządku, money
wyraża twoje zamiary. Jeśli potrzebujesz większej kontroli, użyj decimal
z określoną precyzją i skalą.
Zawsze używam dziesiętnego; Nigdy wcześniej nie korzystałem z PIENIĘDZY.
Niedawno znalazłem artykuł dotyczący przecinku kontra typu danych pieniądze w serwerze SQL, które można znaleźć ciekawe:
Wydaje się również, że typ danych pieniądze nie zawsze prowadzić dokładne wyniki podczas Wykonaj z nim obliczenia: click
Co zrobiłem tak dobrze w przeszłości, używa pola INT i przechowywać kwotę w centach (eurocent/dollarcent).
Czy mógłbyś wyjaśnić, w jaki sposób możemy reprezentować 100/3, 10/3 i 1/3, itp? – NoChance
To zależy od twojej aplikacji !!! Pracuję w usługach finansowych, w których zwykle uważamy, że cena jest znacząca, do 5 miejsc po przecinku, co oczywiście przy zakupie kilku milionów przy cenie 3.12345 pensów/centów to znaczna kwota. Niektóre aplikacje dostarczą własny typ sql, aby to obsłużyć.
Z drugiej strony może nie być to konieczne. <Humor> Stawki dla wykonawców zawsze były zaokrąglane do najbliższych 100 funtów, ale obecnie wydają się być najbliższe 25 funtów w obecnym kryzysie kredytowym. </Humor >
Zastosowanie dziesiętny i używać więcej miejsc dziesiętnych, niż myślisz trzeba będzie tak, że caclulations będą poprawne. Pieniądze nie zwracają poprawnych wyników w obliczeniach. Pod żadnym pozorem nie używaj float lub real, ponieważ są to niedokładne typy danych i mogą powodować błędne obliczenia (zwłaszcza, że stają się bardziej złożone).
Nie wyrównaj swoich przemyśleń na podstawie dostępnych typów danych. Zamiast tego przeanalizuj swoje wymagania, a następnie sprawdź, który typ danych pasuje najlepiej. Float jest zawsze najgorszym wyborem, biorąc pod uwagę ograniczenie architektury w przechowywaniu binarnej wersji liczb zmiennoprzecinkowych. Pieniądze to standardowa jednostka i na pewno będą miały większe wsparcie w zakresie obsługi operacji związanych z pieniędzmi. W przypadku dziesiętnych, będziesz musiał obsłużyć każdy i wszystko, ale wiesz, że tylko ty obsługujesz rodzaj dziesiętny, a więc nie ma niespodzianek, które możesz uzyskać z innymi dwoma typami danych.
W przypadku niektórych danych (np. Pieniędzy), w których nie ma aproksymacji lub zmian wynikających z wartości zmiennoprzecinkowej, należy upewnić się, że dane nigdy nie są "zmienne", muszą być sztywne po obu stronach kropki dziesiętnej.
Jednym z łatwych do uzyskania sposobów jest przekonwertowanie go na typ danych INTEGER i upewnienie się, że podczas odczytywania wartości separator dziesiętny jest umieszczany we właściwym miejscu.
np.
1. Aby zapisać 240,10 USD w bazie danych.
2. Konwersja do czystej postaci całkowitej: 24010 (wiesz, że to tylko przesunięcie dziesiętne).
3. Przywrócić z powrotem do właściwego stanu dziesiętnego. Umieść dziesiętny na 2 pozycje od prawej. 240,10 USD
Tak więc, będąc w databse, będzie to sztywna liczba całkowita.
Dlaczego nie? Z jakimi problemami korzystałeś z pływaka? –
Błędy zaokrąglania najprawdopodobniej – nalply
Jego aplikacja prawdopodobnie wyniosła kilka 200 000 kwot i zabrakło cyfr –