decimal vs double! - Którego mam użyć i kiedy? [duplikat]

To pytanie ma już odpowiedź tutaj:

Ciągle widzę ludzi używających Dubli w C#. Wiem, że czytałem gdzieś, że podwaja się czasami tracąc precyzję. Moje pytanie brzmi, kiedy należy użyć podwójnego i kiedy należy użyć typu dziesiętnego? Jaki typ jest odpowiedni do obliczeń pieniędzy? (tj. więcej niż $100 mln)

Author: HerbalMart, 2009-07-22

7 answers

Dla pieniędzy, Zawsze dziesiętne. Dlatego został stworzony.

Jeśli liczby muszą się prawidłowo sumować lub równoważyć, użyj dziesiętnego. Obejmuje to wszelkie przechowywanie finansowe lub obliczenia, wyniki lub inne liczby, które ludzie mogą robić ręcznie.

Jeśli dokładna wartość liczb nie jest ważna, użyj double dla prędkości. Obejmuje to grafikę, fizykę lub inne obliczenia nauk fizycznych, w których istnieje już "liczba znaczących cyfr".

 927
Author: David,
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-07-22 14:42:15

Moje pytanie brzmi kiedy należy użyć podwójne i kiedy powinienem użyć dziesiętnego Typ?

decimal gdy pracujesz z wartościami w zakresie 10^(+/-28) i gdy masz oczekiwania co do zachowania opartego na reprezentacjach base 10-zasadniczo pieniądze .

double gdy potrzebujesz względnej dokładności (tzn. utrata precyzji w końcowych cyfrach na dużych wartościach nie jest problemem) w skrajnie różnych wielkościach - double obejmuje więcej niż 10^(+/-300). Obliczenia naukowe są tu najlepszym przykładem.

Jaki typ jest odpowiedni dla pieniędzy obliczenia?

Dziesiętne, dziesiętne, dziesiętne

Nie przyjmuj substytutów.

Najważniejszym czynnikiem jest to, że double, zaimplementowany jako ułamek binarny, nie może dokładnie reprezentować wielu decimal ułamków (takich jak 0.1) w ogóle , a jego ogólna liczba cyfr jest mniejsza, ponieważ jest szeroka na 64 bity w porównaniu do 128 bitów dla decimal. Wreszcie, aplikacje finansowe często muszą spełniać określone tryby zaokrąglania (czasami wymagane przez prawo). decimal obsługuje te; double nie.

 159
Author: Michael Borgwardt,
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
2012-01-11 10:18:58

System.Single / float - 7 cyfr
System.Double / podwójne - 15-16 cyfr
System.Dziesiętne / dziesiętne - 28-29 cyfr znaczących

Sposób, w jaki zostałem użądlony przez użycie niewłaściwego typu (dobre kilka lat temu) jest z dużymi ilościami:

  • £520,532.52 - 8 cyfry
  • £1,323,523.12 - 9 cyfry
Zabraknie Ci miliona na platformę.

15-cyfrowy pieniądz wartość:

  • £1,234,567,890,123.45
9 bilionów z podwójnym. Ale z podziałem i porównaniami jest to bardziej skomplikowane(zdecydowanie nie jestem ekspertem w liczbach zmiennoprzecinkowych i irracjonalnych - zobacz punkt marca ). Mieszanie dziesiętnych i podwójnych powoduje problemy:

Operacja matematyczna lub porównawcza który używa liczby zmiennoprzecinkowej może nie dać tego samego wyniku, jeśli liczba dziesiętna jest używana, ponieważ Liczba zmiennoprzecinkowa może nie dokładnie przybliżony dziesiętny numer.

Kiedy należy używać podwójnego zamiast dziesiętnego? ma podobne i bardziej dogłębne odpowiedzi.

Używając double zamiast decimal dla aplikacji monetarnych jest mikro-optymalizacja - to najprostszy sposób, w jaki na to patrzę.

 35
Author: Chris S,
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:33

Dziesiętny jest dla dokładnych wartości. Podwójne to wartości przybliżone.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)
 32
Author: Ian Boyd,
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-07-22 14:59:57

Dla Pieniędzy: decimal. Kosztuje trochę więcej pamięci, ale nie ma problemów z zaokrągleniem, jak double Czasami.

 24
Author: Clement Herreman,
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
2012-01-11 10:18:56

zdecydowanie używaj typów całkowitych do obliczeń pieniędzy. Nie można tego wystarczająco podkreślić, ponieważ na pierwszy rzut oka może się wydawać, że typ zmiennoprzecinkowy jest odpowiedni.

Oto przykład w kodzie Pythona:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0
Wygląda całkiem normalnie.

Teraz spróbuj jeszcze raz z 10^20 dolarów Zimbabwe

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0
Jak widzisz, Dolar zniknął.

Jeśli używasz typu integer, działa dobrze:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1
 6
Author: Otto Allmendinger,
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
2012-04-05 10:12:22

Myślę, że główną różnicą obok szerokości bitów jest to, że decimal ma wykładniczą bazę 10, a double ma 2

Http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html

 5
Author: Honzajscz,
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
2012-04-05 10:11:36