Поделиться через


Числовые типы с плавающей запятой (справочник по C#)

Числовые типы с плавающей запятой представляют реальные числа. Все числовые типы с плавающей запятой являются типами значений. Они также являются простыми типами и могут быть инициализированы с помощью литерала. Все числовые типы с плавающей запятой поддерживают арифметические операторы, сравнения и равенства .

Характеристики типов с плавающей запятой

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 экземпляром, а doublefloat экземпляр не представляет 0,1. Из-за этого различия в числовых типах непредвиденные ошибки округления могут возникать при арифметических вычислениях при использовании double или float для десятичных данных. Вы можете использовать double вместо decimal оптимизации производительности, чем обеспечить точность. Однако любая разница в производительности будет не замечена всеми, но самыми интенсивными приложениями. Еще одна возможная причина, по которой следует избежать decimal , заключается в минимизации требований к хранилищу. Например, ML.NET используется float , так как разница между 4 байтами и 16 байтами добавляется для очень больших наборов данных. Дополнительные сведения см. в разделе System.Decimal.

Вы можете смешивать целые типы и floatdouble типы в выражении. В этом случае целочисленные типы неявно преобразуются в один из типов с плавающей запятой и, при необходимости, float тип неявно преобразуется в double. Выражение вычисляется следующим образом:

  • Если в выражении есть double тип, выражение оценивается как doublebool реляционные, так и сравнения равенства.
  • Если в выражении нет double типа, выражение оценивается как floatbool реляционные, так и сравнения равенства.

Вы также можете смешивать целые типы и decimal тип в выражении. В этом случае целочисленные типы неявно преобразуются в decimal тип, и выражение оценивается в booldecimalили в реляционных и сравнениях равенства.

Нельзя смешивать decimal тип с float типом и double типами в выражении. В этом случае, если вы хотите выполнить арифметические операции, сравнения или равенства, необходимо явно преобразовать операнды из типа или decimal в тип, как показано в следующем примере:

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

Для форматирования значения с плавающей запятой можно использовать строки стандартного числового формата или пользовательские строки числового формата .

Реальные литералы

Тип реального литерала определяется суффиксом следующим образом:

  • Литерал без суффикса или суффикса dD имеет тип double
  • Литерал с суффиксом fF типа float
  • Литерал с суффиксом mM типа 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#:

См. также