Różnica między dziesiętnym, zmiennoprzecinkowym i podwójnym in.NET?

Jaka jest różnica między decimal, float i double w. Net?

Kiedy ktoś mógłby użyć takiego?
Author: PC Luddite, 2009-03-06

18 answers

float i doublezmiennoprzecinkowe 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.

 1986
Author: Jon Skeet,
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
 904
Author: cgreeno,
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.
 66
Author: Mark Jones,
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

Tutaj wpisz opis obrazka

Aby uzyskać więcej informacji, przejdź do źródła tego zdjęcia:

Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5

 54
Author: ,
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-06-07 12:50:10

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 Arytmetyka
 40
Author: CharithJ,
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-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;
 30
Author: GorkemHalulu,
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).

 27
Author: tomosius,
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.

 27
Author: akazemis,
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
  1. Double I float mogą być podzielone przez zero całkowite bez wyjątku zarówno w czasie kompilacji, jak i uruchomienia.
  2. dziesiętny nie może być dzielony przez zero całkowite. Kompilacja zawsze się nie powiedzie, jeśli to zrobisz.
 25
Author: xport,
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!

 24
Author: daniel,
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

Rozwiązanie, o dziwo, polegało na przekonwertowaniu wartości programu Excel na 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.

 14
Author: Mike Gledhill,
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

 11
Author: Mukesh Kumar,
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ż!

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

 7
Author: warnerl,
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) 
 5
Author: schlebe,
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:

  1. typy zmiennych dziesiętnych, podwójnych i zmiennoprzecinkowych różnią się sposobem przechowywania wartości.
  2. 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.
  3. 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 .
 4
Author: GntS,
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.

 3
Author: user3776645,
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
 -1
Author: AH.,
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