decimal vs double! - Którego mam użyć i kiedy? [duplikat]
To pytanie ma już odpowiedź tutaj:
- Kiedy powinienem używać podwójnego zamiast dziesiętnego? 12 odpowiedzi
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)
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".
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.
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
15-cyfrowy pieniądz wartość:
- £1,234,567,890,123.45
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ę.
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)
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.
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
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
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