Typy liczb zmiennoprzecinkowe (odwołanie w C#)

Typy liczb zmiennoprzecinkowe reprezentują liczby rzeczywiste. Wszystkie typy liczb zmiennoprzecinkowe to typy wartości. Są również prostymi typami i mogą być inicjowane literałami. Wszystkie typy liczb zmiennoprzecinkowe obsługują operatory arytmetyczne, porównania i równości .

Charakterystyka typów zmiennoprzecinkowych

Język C# obsługuje następujące wstępnie zdefiniowane typy zmiennoprzecinkowe:

Typ/słowo kluczowe języka C# Przybliżony zakres Dokładność Rozmiar Typ platformy .NET
float ±1,5 x 10−45 do ±3,4 x 1038 ~6–9 cyfr 4 bajty System.Single
double ±5.0 × 10−324 do ±1.7 × 10308 ~15–17 cyfr 8 bajtów System.Double
decimal ±1,0 x 10–28 do ±7,9228 x 1028 28–29 cyfr 16 bajtów System.Decimal

W poprzedniej tabeli każde słowo kluczowe typu C# z lewej kolumny jest aliasem odpowiadającego mu typu .NET. Są one zamienne. Na przykład następujące deklaracje deklarują zmienne tego samego typu:

double a = 12.3;
System.Double b = 12.3;

Wartość domyślna każdego typu zmiennoprzecinkowego to zero, 0. Każdy z typów zmiennoprzecinkowych ma MinValue stałe i MaxValue , które zapewniają minimalną i maksymalną wartość skończona tego typu. Typy float i double zapewniają również stałe reprezentujące wartości nieliczne i nieskończone. Na przykład double typ zawiera następujące stałe: Double.NaN, Double.NegativeInfinityi Double.PositiveInfinity.

Typ decimal jest odpowiedni, gdy wymagany stopień dokładności jest określany przez liczbę cyfr po prawej stronie przecinka dziesiętnego. Takie liczby są często używane w aplikacjach finansowych, w przypadku kwot walutowych (na przykład 1,00 USD), stóp procentowych (na przykład 2,625%), itd. Nawet liczby, które są dokładne dla tylko jednej cyfry dziesiętnej, są obsługiwane dokładniej przez decimal typ: 0,1, na przykład, może być dokładnie reprezentowane przez decimal wystąpienie, podczas gdy nie double ma lub float wystąpienie, które dokładnie reprezentuje 0,1. Ze względu na tę różnicę w typach liczbowych mogą wystąpić nieoczekiwane błędy zaokrąglania w obliczeniach arytmetycznych w przypadku użycia double lub float dla danych dziesiętnych. Zamiast decimal tego można użyć double podczas optymalizacji wydajności jest ważniejsze niż zapewnienie dokładności. Jednak każda różnica w wydajności byłaby niezauważona przez wszystkie, ale najwięcej aplikacji wymagających obliczeń. Innym możliwym powodem, aby uniknąć decimal , jest zminimalizowanie wymagań dotyczących magazynu. Na przykład ML.NET używafloat, ponieważ różnica między 4 bajtami a 16 bajtami sumuje się w przypadku bardzo dużych zestawów danych. Aby uzyskać więcej informacji, zobacz System.Decimal.

Można mieszać typy całkowite i float typy w double wyrażeniu. W takim przypadku typy całkowite są niejawnie konwertowane na jeden z typów zmiennoprzecinkowych, a w razie potrzeby float typ jest niejawnie konwertowany na double. Wyrażenie jest oceniane w następujący sposób:

  • Jeśli w wyrażeniu znajduje double się typ, wyrażenie oblicza doublewartość , lub bool w porównaniach relacyjnych i równości.
  • Jeśli w wyrażeniu nie double ma typu, wyrażenie oblicza floatwartość , lub bool w porównaniach relacyjnych i równości.

Można również mieszać typy całkowite i typ w wyrażeniu decimal . W tym przypadku typy całkowite są niejawnie konwertowane na decimal typ, a wyrażenie daje wartość decimal, lub bool w porównaniach relacyjnych i równości.

Nie można mieszać decimal typu z typami float i double w wyrażeniu. W takim przypadku, jeśli chcesz wykonać operacje arytmetyczne, porównania lub równości, musisz jawnie przekonwertować operandy z lub na decimal typ, jak pokazano w poniższym przykładzie:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

Do formatowania wartości zmiennoprzecinkowej można użyć standardowych ciągów formatu liczbowego lub niestandardowych ciągów formatu liczbowego.

Literały rzeczywiste

Typ literału rzeczywistego jest określany przez jego sufiks w następujący sposób:

  • Literał bez sufiksu lub z sufiksem d jest D typu double
  • Literał z sufiksem f lub F ma typ float
  • Literał z sufiksem m lub M ma typ decimal

Poniższy kod przedstawia przykład każdego z nich:

double d = 3D;
d = 4d;
d = 3.934_001;

float f = 3_000.5F;
f = 5.4f;

decimal myMoney = 3_000.5m;
myMoney = 400.75M;

W poprzednim przykładzie pokazano również użycie jako _separatora cyfr. Separatora cyfr można używać ze wszystkimi rodzajami literałów liczbowych.

Możesz również użyć notacji naukowej, czyli określić wykładniczą część rzeczywistego literału, jak pokazano w poniższym przykładzie:

double d = 0.42e2;
Console.WriteLine(d);  // output 42

float f = 134.45E-2f;
Console.WriteLine(f);  // output: 1.3445

decimal m = 1.5E6m;
Console.WriteLine(m);  // output: 1500000

Konwersje

Istnieje tylko jedna niejawna konwersja między typami liczbowymi zmiennoprzecinkowych: od float do double. Można jednak przekonwertować dowolny typ zmiennoprzecinkowa na dowolny inny typ zmiennoprzecinkowa z jawnym rzutem. Aby uzyskać więcej informacji, zobacz Wbudowane konwersje liczbowe.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Zobacz też