Jaki jest najlepszy typ danych do wykorzystania za pieniądze w c#?

Jaki jest najlepszy typ danych do wykorzystania za pieniądze w c#?

 353
Author: Elijah, 2009-03-28

9 answers

Jak to jest opisane w jako:

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;
 344
Author: Lee Treveil,
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

System.Dziesiętne

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.

 109
Author: David Walschots,
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ę.

 61
Author: lmsasu,
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

 20
Author: SquidScareMe,
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:

Http://msdn.microsoft.com/en-us/library/364x0z75.aspx

 15
Author: dommer,
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.

 13
Author: Lennaert,
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.

 8
Author: dsz,
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.

 4
Author: Noel Kennedy,
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.

 4
Author: Scott Hannen,
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