Różnica między dziesiętnym, zmiennoprzecinkowym i podwójnym in.NET?
Jaka jest różnica między decimal
, float
i double
w. Net?
18 answers
float
i double
są zmiennoprzecinkowe binarne typy punktowe . Innymi słowy, reprezentują liczbę taką jak ta:
10001.10010110011
Liczba binarna i położenie punktu binarnego są zakodowane wewnątrz wartości.
decimal
jest zmiennoprzecinkowym dziesiętnym typu punktowego. Innymi słowy, reprezentują liczbę taką jak ta:
12345.65789
Ponownie, liczba i położenie punktu dziesiętnego {[12] } są zakodowane wewnątrz wartości – to co sprawia, że decimal
nadal jest typem zmiennoprzecinkowym zamiast typu stałego punktu.
Ważną rzeczą jest to, że ludzie są przyzwyczajeni do reprezentowania Nie-liczb całkowitych w postaci dziesiętnej i oczekują dokładnych wyników w reprezentacjach dziesiętnych; nie wszystkie liczby dziesiętne są dokładnie reprezentowalne w binarnym punkcie zmiennoprzecinkowym – na przykład-więc jeśli użyjesz binarnej wartości zmiennoprzecinkowej, otrzymasz przybliżenie do 0.1. Nadal otrzymasz przybliżenia, gdy używasz zmiennego punktu dziesiętnego jako cóż-wynik dzielenia 1 przez 3 nie może być dokładnie przedstawiony, na przykład.
Jak używać kiedy:
Dla wartości, które są "naturalnie dokładnymi dziesiętnymi", dobrze jest użyć
decimal
. Jest to zwykle odpowiednie dla wszelkich pojęć wymyślonych przez ludzi: wartości finansowe są najbardziej oczywistym przykładem, ale są też inne. Rozważmy np. wynik uzyskany nurkom lub łyżwiarzom.Dla wartości, które są bardziej artefaktami natury, które nie mogą naprawdę być zmierzone dokładnie w każdym razie,
float
/double
są bardziej odpowiednie. Na przykład dane naukowe są zwykle reprezentowane w tej formie. W tym przypadku oryginalne wartości nie będą na początku "dokładnością dziesiętną" , więc nie jest ważne, aby oczekiwane wyniki utrzymywały "dokładność dziesiętną". Zmiennoprzecinkowe typy punktów binarnych są znacznie szybsze w obsłudze niż liczby dziesiętne.
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-01-26 16:42:21
Precyzja jest główną różnicą.
Float - 7 cyfr (32 bit)
Podwójne -15-16 cyfr (64 bit)
Decimal - 28-29 cyfr znaczących (128 bitów)
Liczby dziesiętne mają znacznie większą precyzję i są zwykle używane w zastosowaniach finansowych, które wymagają wysokiego stopnia dokładności. Liczby dziesiętne są znacznie wolniejsze (do 20X razy w niektórych testach) niż double/float.
Dziesiętne i pływaki/dublerzy nie mogą być porównywane bez rzutu natomiast pływaki i Duble mogą. Liczby dziesiętne pozwalają również na kodowanie lub końcowe zera.
float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
Wynik:
float: 0.3333333
double: 0.333333333333333
decimal: 0.3333333333333333333333333333
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
2015-04-14 16:34:42
Struktura dziesiętna jest ściśle dostosowana do obliczeń finansowych wymagających dokładności, które są stosunkowo nietolerancyjne dla zaokrąglania. Liczby dziesiętne nie są odpowiednie do zastosowań naukowych, jednak z kilku powodów:
- Pewna utrata precyzji jest akceptowalna w wielu obliczeniach naukowych ze względu na praktyczne ograniczenia problemu fizycznego lub mierzonego artefaktu. Utrata precyzji nie jest akceptowalna w finansach.
- dziesiętny jest znacznie (dużo) wolniejszy niż float i double dla większości operacji, głównie dlatego, że operacje zmiennoprzecinkowe są wykonywane w systemie binarnym, podczas gdy operacje dziesiętne są wykonywane w bazie 10 (tzn. float i Double są obsługiwane przez sprzęt FPU, taki jak MMX/SSE, podczas gdy dziesiętne są obliczane w oprogramowaniu).
- Decimal ma niedopuszczalnie mniejszy zakres wartości niż double, pomimo faktu, że obsługuje więcej cyfr precyzji. Dlatego dziesiętne nie mogą być używane do reprezentowania wielu wartości naukowych.
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
2011-04-13 13:55:01
Aby uzyskać więcej informacji, przejdź do źródła tego zdjęcia:
float
7 cyfry precyzji
double
ma około 15 cyfr precyzji
decimal
ma około 28 cyfr precyzji
Jeśli potrzebujesz lepszej dokładności, użyj double zamiast float. W nowoczesnych procesorach oba typy danych mają prawie taką samą wydajność. Jedyną zaletą korzystania z float jest to, że zajmują mniej miejsca. Praktycznie ma znaczenie tylko wtedy, gdy masz ich wiele.
To ciekawe. Co Każdy Informatyk Powinien Wiedzieć O Zmiennoprzecinkowym ArytmetykaWarning: 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
2014-07-15 21:42:14
Nikt o tym nie wspomniał
W ustawieniach domyślnych, Floats (System.Pojedyncze) i podwójne (System.Podwójne) nigdy nie użyje sprawdzanie przepełnienia podczas dziesiętnego (System.Dziesiętne) będzie zawsze używać sprawdzanie przepełnienia.
Znaczy
decimal myNumber = decimal.MaxValue;
myNumber += 1;
Throws OverflowException .
Ale te nie:
float myNumber = float.MaxValue;
myNumber += 1;
&
double myNumber = double.MaxValue;
myNumber += 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
2015-04-15 13:55:10
Nie będę powtarzał ton dobrych (i niektórych złych) informacji, na które już odpowiedziałam w innych odpowiedziach i komentarzach, ale odpowiem na twoje pytanie z podpowiedzią:
Kiedy ktoś mógłby użyć takiego?
Użyj dziesiętnych dla liczonych wartości
Użyj float/double dla zmierzonych wartości
Niektóre przykłady:
Pieniądze (liczymy pieniądze czy mierzymy pieniądze?)
Distance (do we count distance czy zmierzyć odległość? *)
Wyniki (liczymy wyniki czy mierzymy wyniki?)
Zawsze liczymy pieniądze i nigdy nie powinniśmy ich mierzyć. Zazwyczaj mierzymy odległość. Często liczymy wyniki.
* w niektórych przypadkach, co nazwałbym Odległość nominalna, możemy rzeczywiście chcieć "policzyć" odległość. Na przykład, być może mamy do czynienia ze znakami państw, które pokazują odległości do miast i wiemy, że te odległości nigdy nie mają więcej niż jedną cyfrę dziesiętną (xxx. x km).
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
2016-04-22 15:18:17
Typy zmiennych dziesiętnych, podwójnych i zmiennoprzecinkowych różnią się sposobem przechowywania wartości. Precyzja jest główną różnicą, gdzie float jest typem danych zmiennoprzecinkowych single precision (32 bit), double jest typem danych zmiennoprzecinkowych double precision (64 bit), a decimal jest 128-bitowym typem danych zmiennoprzecinkowych.
Float - 32 bit (7 cyfr)
Double-64 bit (15-16 cyfr)
Dziesiętny-128 bit (28-29 cyfr znaczących)
Główna różnica polega na pływaniu dwójki są binarnymi typami zmiennoprzecinkowymi, a dziesiętny zapisuje wartość jako zmiennoprzecinkowy Typ dziesiętny. Tak więc liczby dziesiętne mają znacznie większą precyzję i są zwykle używane w zastosowaniach monetarnych (finansowych) lub naukowych, które wymagają wysokiego stopnia dokładności. Ale w wydajności Decymale są wolniejsze niż typy double I float.
Decimal może w 100% dokładnie reprezentować dowolną liczbę z dokładnością formatu dziesiętnego, podczas gdy Float i Double nie mogą dokładnie reprezentują wszystkie liczby, parzyste liczby, które mieszczą się w odpowiednich formatach.
Dziesiętne
W przypadku zastosowań finansowych lub obliczeń naukowych lepiej jest używać typów dziesiętnych, ponieważ daje to wysoki poziom dokładności i łatwo uniknąć błędów zaokrąglania
Double
Typy Podwójne są prawdopodobnie najczęściej używanym typem danych dla wartości rzeczywistych, z wyjątkiem obsługi pieniądze.
Float
Jest używany głównie w bibliotekach graficznych ze względu na bardzo wysokie wymagania dotyczące mocy przetwarzania, stosowane są również sytuacje, które mogą znosić 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
2016-06-19 04:34:18
- Double I float mogą być podzielone przez zero całkowite bez wyjątku zarówno w czasie kompilacji, jak i uruchomienia.
- dziesiętny nie może być dzielony przez zero całkowite. Kompilacja zawsze się nie powiedzie, jeśli to zrobisz.
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
2010-07-29 07:21:10
Liczby całkowite, jak już wspomniano, są liczbami całkowitymi. Nie mogą przechować punktu .7, .42, i .007. Jeśli chcesz przechowywać liczby, które nie są liczbami całkowitymi, potrzebujesz innego typu zmiennej. Możesz użyć typu double lub typu float. Te typy zmiennych ustawiasz dokładnie w ten sam sposób: zamiast używać słowa int
, wpisujesz double
lub float
. Tak:
float myFloat;
double myDouble;
(float
jest skrótem od "zmiennoprzecinkowego" i oznacza po prostu liczbę z punktem coś na koniec.)
Różnica między nimi polega na wielkości liczb, które mogą pomieścić. Dla float
możesz mieć do 7 cyfr w swoim numerze. Dla double
s, możesz mieć do 16 cyfr. Aby być bardziej precyzyjnym, Oto oficjalny rozmiar: {]}
float: 1.5 × 10^-45 to 3.4 × 10^38
double: 5.0 × 10^-324 to 1.7 × 10^308
float
jest liczbą 32-bitową, a double
jest liczbą 64-bitową.
Kliknij dwukrotnie nowy przycisk, aby uzyskać kod. Dodaj następujące trzy linie do kodu przycisku:
double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
Zatrzymaj swój program i wróć do kodowania okno. Zmień tę linię:
myDouble = 0.007;
myDouble = 12345678.1234567;
Uruchom program i kliknij podwójny przycisk. W polu wiadomości poprawnie wyświetlany jest numer. Dodaj kolejną liczbę na końcu, A C# ponownie zaokrągli się w górę lub w dół. Morał jest taki, że jeśli chcesz dokładności, uważaj na zaokrąglenia!
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-19 12:42:18
To był dla mnie interesujący wątek, ponieważ dzisiaj właśnie mieliśmy paskudny mały błąd, dotyczący decimal
mniejszej precyzji niż float
.
W naszym kodzie C# odczytujemy wartości liczbowe z arkusza kalkulacyjnego Excel, przekształcamy je w decimal
, a następnie wysyłamy decimal
z powrotem do usługi, aby zapisać je w bazie danych SQL Server.
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
decimal value = 0;
Decimal.TryParse(cellValue.ToString(), out value);
}
Teraz, dla prawie wszystkich naszych wartości Excela, to działało pięknie. Ale dla niektórych bardzo małe wartości Excela, za pomocą decimal.TryParse
całkowicie stracił wartość. Jednym z takich przykładów jest
CellValue = 0.00006317592
dziesiętne.Trypar (bułg.ToString (), out value); / / zwróci0
double
, a następnie na decimal
:
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
double valueDouble = 0;
double.TryParse(cellValue.ToString(), out valueDouble);
decimal value = (decimal) valueDouble;
…
}
Chociaż double
ma mniejszą precyzję niż decimal
, to w rzeczywistości zapewniło, że małe liczby nadal będą rozpoznany. Z jakiegoś powodu, double.TryParse
faktycznie był w stanie pobierać tak małe liczby, podczas gdy decimal.TryParse
ustawiłby je na zero.
Dziwne. Bardzo dziwne.
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-19 10:45:39
Float ~ ±1,5 x 10-45 do ±3,4 x 1038 --------7 figures
podwójne ~ ±5,0 x 10-324 do ±1,7 x 10308 ------15 lub 16 cyfr
dziesiętne ~ ±1,0 x 10-28 do ±7,9 x 1028 --------28 lub 29 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
2014-01-02 05:01:41
W przypadku aplikacji, takich jak gry i systemy wbudowane, w których pamięć i wydajność mają kluczowe znaczenie, float jest zwykle wybieranym typem liczbowym, ponieważ jest szybszy i o połowę mniejszy od podwójnego. Liczba całkowita była bronią z wyboru, ale wydajność zmiennoprzecinkowa wyprzedziła liczbę całkowitą we współczesnych procesorach. Dziesiętny jest tuż!
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
2016-04-11 22:52:05
Typy zmiennych dziesiętnych, podwójnych i zmiennoprzecinkowych różnią się sposobem przechowywania wartości. Precyzja jest główną różnicą, gdzie float jest typem danych zmiennoprzecinkowych single precision (32 bit), double jest typem danych zmiennoprzecinkowych double precision (64 bit), a decimal jest 128-bitowym typem danych zmiennoprzecinkowych.
Float - 32 bit (7 cyfr)
Double-64 bit (15-16 cyfr)
Dziesiętny-128 bit (28-29 cyfr znaczących)
Więcej o...the różnica między dziesiętnym, zmiennoprzecinkowym i podwójnym
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
2015-01-13 12:56:35
Problem z tymi typami polega na tym, że pewna nieprecyzyjność I że ten problem może wystąpić przy małych liczbach dziesiętnych, jak w poniższym przykładzie
Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1
If fMean - fDelta < fLimit Then
bLower = True
Else
bLower = False
End If
Pytanie: jaką wartość zawiera zmienna bLower ?
Odpowiedź: na 32-bitowej maszynie dmuchawa zawiera TRUE !!!
Jeśli zamienię Podwójne na dziesiętne, dmuchawa zawiera FALSE, co jest dobrą odpowiedzią.
W podwójnym, problem polega na tym, że fMean-fDelta = 1.0999999999999999999999, to jest niższe niż 1.1.
Uwaga: myślę, że ten sam problem z pewnością może istnieć dla innych liczb, ponieważ dziesiętne jest tylko podwójne z większą precyzją i precyzja ma zawsze granicę.
W rzeczywistości Double, Float i Decimal odpowiadają binarnemu dziesiętnemu w COBOLu !
Szkoda, że inne typy liczbowe zaimplementowane w COBOLu nie istnieją w .Net. dla tych, którzy nie znają COBOLa, istnieją w COBOLu następujące typy liczbowe
BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte)
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-02-23 13:05:31
W prostych słowach:
- typy zmiennych dziesiętnych, podwójnych i zmiennoprzecinkowych różnią się sposobem przechowywania wartości.
- precyzja jest główna różnica (zauważ, że nie jest to pojedyncza różnica) gdzie floatjest typem danych zmiennoprzecinkowych single precision (32 bit), double {[10] } jest typem danych zmiennoprzecinkowych double precision (64 bit), a decimal jest 128-bitowym typem danych zmiennoprzecinkowych.
- podsumowanie Tabela:
/==========================================================================================
Type Bits Have up to Approximate Range
/==========================================================================================
float 32 7 digits -3.4 × 10 ^ (38) to +3.4 × 10 ^ (38)
double 64 15-16 digits ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
decimal 128 28-29 significant digits ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
Możesz przeczytać więcej tutaj, Float, Podwójne i dziesiętne .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-10 09:19:02
Główną różnicą między nimi jest precyzja.
float
jest liczbą 32-bit
, double
jest liczbą 64-bit
, A decimal
jest liczbą 128-bit
.
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
2015-06-06 08:07:02
Możesz również sprawdzić dokumentację tutaj:
Https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal
Https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/float
Https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/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
2018-08-16 07:10:08