Jaki jest najlepszy typ danych do wykorzystania za pieniądze w c#?
Jaki jest najlepszy typ danych do wykorzystania za pieniądze w c#?
9 answers
Słowo kluczowe dziesiętne wskazuje 128-bitowy typ danych. W porównaniu do typy zmiennoprzecinkowe, Typ dziesiętny ma większą precyzję i mniejszy zakres, co sprawia, że nadaje się do Finansowych i monetarnych obliczenia.
Możesz użyć dziesiętnego w następujący sposób:
decimal myMoney = 300.5m;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-14 15:26:36
Typ Decimal value reprezentuje liczby dziesiętne w zakresie od dodatnich 79,228,162,514,264,337,593,543,950,335 do ujemnych 79,228,162,514,264,337,593,543,950,335. Typ wartości dziesiętnej jest odpowiedni do obliczeń finansowych wymagających dużej liczby znaczących cyfr całkowych i ułamkowych oraz braku błędów zaokrąglania. Typ dziesiętny nie eliminuje potrzeby zaokrąglania. Zamiast tego minimalizuje błędy spowodowane zaokrągleniem.
I ' d chciałbym wskazać tę doskonałą odpowiedź przez zneak na Dlaczego Podwójne nie powinno być używane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:44
Użyj wzorca pieniędzy z wzorców architektury aplikacji korporacyjnych ; określ kwotę jako liczbę dziesiętną, a walutę jako liczbę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 10:42:31
Dziesiętne. Jeśli wybierzesz opcję double, pozostajesz otwarty na błędy zaokrąglania
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-28 19:33:19
Decimal ma mniejszy zakres, ale większą precyzję - więc nie tracisz tych wszystkich groszy z czasem!
Pełne szczegóły tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-28 19:34:45
Zgadzam się ze wzorem pieniądza: Obsługa walut jest zbyt uciążliwa, gdy używasz dziesiętnych.
Jeśli utworzysz klasę waluty, możesz umieścić tam całą logikę związaną z pieniędzmi, w tym poprawną metodę ToString (), większą kontrolę wartości parsowania i lepszą kontrolę podziałów.
Ponadto, w przypadku klasy walutowej, nie ma szans na niezamierzone zmieszanie pieniędzy z innymi danymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-28 20:07:43
Inną opcją (szczególnie jeśli obracasz własną klasę) jest użycie int lub int64 i wyznaczenie niższych czterech cyfr (lub ewentualnie nawet 2) jako "prawo punktu dziesiętnego". Więc" na krawędziach "będziesz potrzebował" * 10000 "po drodze i "/ 10000"po drodze. Jest to mechanizm przechowywania używany przez Microsoft SQL Server, zobacz http://msdn.microsoft.com/en-au/library/ms179882.aspx
The nicity of this is that all your sumation can be done using (fast) arytmetyka całkowita.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 22:21:03
Stwórz własną klasę. Wydaje się to dziwne, ale Typ. Net jest niewystarczający do pokrycia różnych walut.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-28 20:03:12
Większość aplikacji, z którymi pracowałem, używa decimal
do reprezentowania pieniędzy. Opiera się to na założeniu, że aplikacja nigdy nie będzie dotyczyć więcej niż jednej waluty.
To założenie może opierać się na innym założeniu, że aplikacja nigdy nie będzie używana w innych krajach o różnych walutach. Widziałem przypadki, w których okazało się to nieprawdą.
Teraz to założenie jest kwestionowane w nowy sposób: nowe waluty, takie jak Bitcoin, stają się coraz bardziej powszechne, i nie są specyficzne dla żadnego kraju. Nie jest nierealne, że aplikacja używana tylko w jednym kraju może nadal potrzebować obsługi wielu walut.
Niektórzy powiedzą, że tworzenie lub nawet używanie typu tylko dla pieniędzy to "pozłacanie" lub dodawanie dodatkowej złożoności poza znane wymagania. Zdecydowanie się nie zgadzam. Im bardziej wszechobecna koncepcja jest w Twojej domenie, tym ważniejsze jest, aby podjąć rozsądny wysiłek, aby użyć prawidłowej abstrakcji z góry. Jeśli chcesz zobacz złożoność, spróbuj pracować w aplikacji, która używała decimal
, a teraz jest dodatkowa właściwość Currency
obok każdej właściwości decimal
.
Jeśli użyjesz niewłaściwej abstrakcji z góry, zastąpienie jej później będzie sto razy więcej pracy. Oznacza to potencjalnie wprowadzenie wad do istniejącego kodu, a najlepsze jest to, że wady te będą prawdopodobnie obejmować kwoty pieniędzy, Transakcje z pieniędzmi lub cokolwiek z pieniędzmi.
I to nie jest takie trudne w użyciu coś innego niż dziesiętne. Google "NuGet money type" i zobaczysz, że wielu programistów stworzyło takie abstrakcje (w tym ja. To proste. To tak proste, jak użycie DateTime
zamiast przechowywania daty w string
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 01:18:25