Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Числовые типы с плавающей запятой представляют реальные числа. Все числовые типы с плавающей запятой являются типами значений. Они также являются простыми типами и могут быть инициализированы с помощью литерала. Все числовые типы с плавающей запятой поддерживают арифметические операторы, сравнения и равенства .
Характеристики типов с плавающей запятой
C# поддерживает следующие предопределенные типы с плавающей запятой:
Тип/ключевое слово C# | Приблизительный диапазон | Точность | Размер | Тип .NET |
---|---|---|---|---|
float |
±1.5 x 10–45 до ±3.4 x 1038 | ~6-9 цифр | 4 байта | System.Single |
double |
±5.0 × 10–324 до ±1.7 × 10308 | ~15-17 цифр | 8 байт | System.Double |
decimal |
±1.0 x 10-28 до ±7.9228 x 1028 | 28-29 цифр | 16 байт | System.Decimal |
В предыдущей таблице каждое ключевое слово типа C# из левого столбца является псевдонимом соответствующего типа .NET. Они взаимозаменяемы. Например, следующие объявления объявляют переменные одного типа:
double a = 12.3;
System.Double b = 12.3;
Значение по умолчанию каждого типа с плавающей запятой равно нулю. 0
Каждый из типов с плавающей запятой имеет MinValue
и MaxValue
константы, обеспечивающие минимальное и максимальное конечное значение этого типа.
float
double
Типы также предоставляют константы, представляющие значения без числа и бесконечности. Например, double
тип предоставляет следующие константы: Double.NaN, Double.NegativeInfinityи Double.PositiveInfinity.
Тип decimal
подходит, если требуемая степень точности определяется числом цифр справа от десятичной запятой. Такие цифры обычно используются в финансовых приложениях, для денежных сумм (например, $1,00), процентных ставок (например, 2,625%) и т. д. Даже числа, точные только к одной десятичной цифре, обрабатываются более точно decimal
типом: 0,1, например, может быть точно представлен decimal
экземпляром, а double
float
экземпляр не представляет 0,1. Из-за этого различия в числовых типах непредвиденные ошибки округления могут возникать при арифметических вычислениях при использовании double
или float
для десятичных данных. Вы можете использовать double
вместо decimal
оптимизации производительности, чем обеспечить точность. Однако любая разница в производительности будет не замечена всеми, но самыми интенсивными приложениями. Еще одна возможная причина, по которой следует избежать decimal
, заключается в минимизации требований к хранилищу. Например, ML.NET используется float
, так как разница между 4 байтами и 16 байтами добавляется для очень больших наборов данных. Дополнительные сведения см. в разделе System.Decimal.
Вы можете смешивать целые типы и float
double
типы в выражении. В этом случае целочисленные типы неявно преобразуются в один из типов с плавающей запятой и, при необходимости, float
тип неявно преобразуется в double
. Выражение вычисляется следующим образом:
- Если в выражении есть
double
тип, выражение оценивается какdouble
bool
реляционные, так и сравнения равенства. - Если в выражении нет
double
типа, выражение оценивается какfloat
bool
реляционные, так и сравнения равенства.
Вы также можете смешивать целые типы и decimal
тип в выражении. В этом случае целочисленные типы неявно преобразуются в decimal
тип, и выражение оценивается в bool
decimal
или в реляционных и сравнениях равенства.
Нельзя смешивать decimal
тип с float
типом и double
типами в выражении. В этом случае, если вы хотите выполнить арифметические операции, сравнения или равенства, необходимо явно преобразовать операнды из типа или decimal
в тип, как показано в следующем примере:
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
Для форматирования значения с плавающей запятой можно использовать строки стандартного числового формата или пользовательские строки числового формата .
Реальные литералы
Тип реального литерала определяется суффиксом следующим образом:
- Литерал без суффикса или суффикса
d
D
имеет типdouble
- Литерал с суффиксом
f
F
типаfloat
- Литерал с суффиксом
m
M
типаdecimal
В следующем коде показан пример каждого из них:
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;
В предыдущем примере также показано использование _
в качестве разделителя цифр. Вы можете использовать разделитель цифр со всеми типами числовых литералов.
Вы также можете использовать научные нотации, то есть указать экспонентную часть реального литерала, как показано в следующем примере:
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
Преобразования
Существует только одно неявное преобразование между числовыми типами с плавающей запятой: от float
до double
. Однако можно преобразовать любой тип с плавающей запятой в любой другой тип с плавающей запятой с явным приведением. Дополнительные сведения см. в разделе "Встроенные числовые преобразования".
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
- Типы с плавающей запятой
- Десятичный тип
- Реальные литералы
См. также
- типы значений
- Целочисленные типы
- Стандартные строки числового формата
- Числовые значения в .NET
- System.Numerics.Complex