Меню Закрыть

Типы данных с плавающей точкой c

Содержание

Типы с плавающей запятой — это подмножество простых типов. Они могут инициализироваться литералами. The floating-point types are a subset of the simple types and can be initialized with literals. Все типы с плавающей запятой также являются типами значений. All floating-point types are also value types. Все числовые типы с плавающей запятой поддерживают арифметические операторы, а также операторы сравнения и равенства. All floating-point numeric types support arithmetic, comparison, and equality operators.

Характеристики типов с плавающей запятой Characteristics of the floating-point types

C# поддерживает следующие предварительно определенные типы с плавающей запятой: C# supports the following predefined floating-point types:

Ключевое слово или тип C# C# type/keyword Приблизительный диапазон значений Approximate range Точность Precision Размер Size Тип .NET .NET type
float От ±1,5 x 10 −45 до ±3,4 x 10 38 ±1.5 x 10 −45 to ±3.4 x 10 38 6–9 цифр

6-9 digits

4 байта 4 bytes System.Single double от ±5,0 × 10 −324 до ±1,7 × 10 308 ±5.0 × 10 −324 to ±1.7 × 10 308 15–17 цифр

15-17 digits

8 байт 8 bytes System.Double decimal от ±1,0 x 10 -28 до ±7,9228 x 10 28 ±1.0 x 10 -28 to ±7.9228 x 10 28 28-29 знаков 28-29 digits 16 байт 16 bytes System.Decimal

В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET. In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Они взаимозаменяемые. They are interchangeable. Например, следующие объявления объявляют переменные одного типа: For example, the following declarations declare variables of the same type:

По умолчанию все типы с плавающей запятой имеют значение 0 . The default value of each floating-point type is zero, 0 . Все типы с плавающей запятой имеют константы MinValue и MaxValue с минимальным и максимальными итоговыми значениями этого типа. Each of the floating-point types has the MinValue and MaxValue constants that provide the minimum and maximum finite value of that type. Типы float и double также предоставляют константы, обозначающие бесконечные и нечисловые значения. The float and double types also provide constants that represent not-a-number and infinity values. Например, тип double предоставляет следующие константы: Double.NaN, Double.NegativeInfinity и Double.PositiveInfinity. For example, the double type provides the following constants: Double.NaN, Double.NegativeInfinity, and Double.PositiveInfinity.

Так как тип decimal характеризуется более высокой точностью и меньшим диапазоном, чем float и double , он подходит для финансовых расчетов. Because the decimal type has more precision and a smaller range than both float and double , it’s appropriate for financial and monetary calculations.

В одном и том же выражении можно сочетать и целочисленные типы, и типы с плавающей запятой. You can mix integral types and floating-point types in an expression. В этом случае целочисленные типы преобразуются в типы с плавающей запятой. In this case, the integral types are converted to floating-point types. Выражение вычисляется по следующим правилам: The evaluation of the expression is performed according to the following rules:

  • Если одним из типов с плавающей запятой является double , выражение оценивается как double или bool в реляционных сравнениях или сравнениях на равенство. If one of the floating-point types is double , the expression evaluates to double , or to bool in relational and equality comparisons.
  • Если в выражении нет типа double , оно оценивается как float или bool в реляционных сравнениях или сравнениях на равенство. If there is no double type in the expression, the expression evaluates to float , or to bool in relational and equality comparisons.

Выражение с плавающей запятой может содержать следующие наборы значений: A floating-point expression can contain the following sets of values:

  • Положительный и отрицательный ноль Positive and negative zero
  • Положительная и отрицательная бесконечность Positive and negative infinity
  • Нечисловое значение (NaN) Not-a-Number value (NaN)
  • Конечный набор ненулевых значений The finite set of nonzero values

Дополнительные сведения об этих значениях см. в документе "Стандарт IEEE для двоичной арифметики с плавающей запятой" на веб-сайте IEEE. For more information about these values, see IEEE Standard for Binary Floating-Point Arithmetic, available on the IEEE website.

Можно использовать строки стандартных числовых форматов или строки пользовательских числовых форматов для форматирования значения с плавающей запятой. You can use either standard numeric format strings or custom numeric format strings to format a floating-point value.

Вещественные литералы Real literals

Тип реального литерала определяется его суффиксом следующим образом: The type of a real literal is determined by its suffix as follows:

  • Литерал без суффикса или с суффиксом d или D имеет тип double . The literal without suffix or with the d or D suffix is of type double
  • Литерал с суффиксом f или F имеет тип float . The literal with the f or F suffix is of type float
  • Литерал с суффиксом m или M имеет тип decimal . The literal with the m or M suffix is of type decimal
Читайте также:  150 Символов это сколько

В приведенном ниже коде показан пример каждого из них. The following code demonstrates an example of each:

В предыдущем примере также показано использование _ в качестве цифрового разделителя, который поддерживается, начиная с версии C# 7.0. The preceding example also shows the use of _ as a digit separator, which is supported starting with C# 7.0. Цифровой разделитель можно использовать со всеми видами числовых литералов. You can use the digit separator with all kinds of numeric literals.

Можно также использовать экспоненциальное представление, то есть указать экспоненту вещественного литерала, как показано в следующем примере: You also can use scientific notation, that is, specify an exponent part of a real literal, as the following example shows:

Преобразования Conversions

Существует только одно неявное преобразование между числовыми типами с плавающей запятой: из float в double . There is only one implicit conversion between floating-point numeric types: from float to double . Однако можно преобразовать любой тип с плавающей запятой в любой другой тип с плавающей запятой с помощьюявного приведения. However, you can convert any floating-point type to any other floating-point type with the explicit cast. Для получения дополнительной информации см. статью Встроенные числовые преобразования. For more information, see Built-in numeric conversions.

Спецификация языка C# C# language specification

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: For more information, see the following sections of the C# language specification:

Типы данных имеют особенное значение в C#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как "бестиповая" переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.

В C# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно, в то время как ссылочный тип (reference type) хранит ссылку на значение.

Эти типы сохраняются в разных местах памяти: типы значений сохраняются в области, известной как стек, а ссылочные типы — в области, называемой управляемой кучей.

Давайте разберем типы значений.

Целочисленные типы

В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:

Целочисленные типы C#

Тип Тип CTS Разрядность в битах Диапазон
byte System.Byte 8 0:255
sbyte System.SByte 8 -128:127
short System.Int16 16 -32768 : 32767
ushort System.UInt16 16 0 : 65535
int System.Int32 32 -2147483648 : 2147483647
uint System.UInt32 32 0 : 4294967295
long System.Int64 64 -9223372036854775808 : 9223372036854775807
ulong System.UInt64 64 0 : 18446744073709551615

Как следует из приведенной выше таблицы, в C# определены оба варианта различных целочисленных типов: со знаком и без знака. Целочисленные типы со знаком отличаются от аналогичных типов без знака способом интерпретации старшего разряда целого числа. Так, если в программе указано целочисленное значение со знаком, то компилятор C# сгенерирует код, в котором старший разряд целого числа используется в качестве флага знака. Число считается положительным, если флаг знака равен 0, и отрицательным, если он равен 1.

Отрицательные числа практически всегда представляются методом дополнения до двух, в соответствии с которым все двоичные разряды отрицательного числа сначала инвертируются, а затем к этому числу добавляется 1.

Вероятно, самым распространенным в программировании целочисленным типом является тип int. Переменные типа int нередко используются для управления циклами, индексирования массивов и математических расчетов общего назначения. Когда же требуется целочисленное значение с большим диапазоном представления чисел, чем у типа int, то для этой цели имеется целый ряд других целочисленных типов.

Так, если значение нужно сохранить без знака, то для него можно выбрать тип uint, для больших значений со знаком — тип long, а для больших значений без знака — тип ulong. В качестве примера ниже приведена программа, вычисляющая расстояние от Земли до Солнца в сантиметрах. Для хранения столь большого значения в ней используется переменная типа long:

Читайте также:  Удобные игры для ноутбука

Всем целочисленным переменным значения могут присваиваться в десятичной или шестнадцатеричной системе обозначений. В последнем случае требуется префикс 0x:

Если возникает какая-то неопределенность относительно того, имеет ли целое значение тип int, uint, long или ulong, то по умолчанию принимается int. Чтобы явно специфицировать, какой другой целочисленный тип должно иметь значение, к числу можно добавлять следующие символы:

U и L можно также указывать в нижнем регистре, хотя строчную L легко зрительно спутать с цифрой 1 (единица).

Типы с плавающей точкой

Типы с плавающей точкой позволяют представлять числа с дробной частью. В C# имеются две разновидности типов данных с плавающей точкой: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно. Так, разрядность типа float составляет 32 бита, что приближенно соответствует диапазону представления чисел от 5E-45 до 3,4E+38. А разрядность типа double составляет 64 бита, что приближенно соответствует диапазону представления чисел от 5E-324 до 1,7Е+308.

Тип данных float предназначен для меньших значений с плавающей точкой, для которых требуется меньшая точность. Тип данных double больше, чем float, и предлагает более высокую степень точности (15 разрядов).

Если нецелочисленное значение жестко кодируется в исходном тексте (например, 12.3), то обычно компилятор предполагает, что подразумевается значение типа double. Если значение необходимо специфицировать как float, потребуется добавить к нему символ F (или f):

Десятичный тип данных

Для представления чисел с плавающей точкой высокой точности предусмотрен также десятичный тип decimal, который предназначен для применения в финансовых расчетах. Этот тип имеет разрядность 128 бит для представления числовых значений в пределах от 1Е-28 до 7,9Е+28. Вам, вероятно, известно, что для обычных арифметических вычислений с плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представить числа с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому что этот тип данных способен представлять десятичные значения без ошибок округления, он особенно удобен для расчетов, связанных с финансами:

Результатом работы данной программы будет:

Символы

В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например С++, а 16-разрядным кодом, который называется юникодом (Unicode). В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char, представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством юникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в C#.

Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки:

Несмотря на то что тип char определен в C# как целочисленный, его не следует путать со всеми остальными целочисленными типами. Дело в том, что в C# отсутствует автоматическое преобразование символьных значений в целочисленные и обратно. Например, следующий фрагмент кода содержит ошибку:

Наравне с представлением char как символьных литералов, их можно представлять как 4-разрядные шестнадцатеричные значения Unicode (например, ‘u0041’), целочисленные значения с приведением (например, (char) 65) или же шестнадцатеричные значения (например, ‘x0041’). Кроме того, они могут быть представлены в виде управляющих последовательностей.

Логический тип данных

Тип bool представляет два логических значения: "истина" и "ложь". Эти логические значения обозначаются в C# зарезервированными словами true и false соответственно. Следовательно, переменная или выражение типа bool будет принимать одно из этих логических значений. Кроме того, в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 — в значение false.

Как и во многих языках программирования, в C# есть своя система типов данных, которая используется для создания переменных. Тип данных определяет внутреннее представление данных, множество значений, которые может принимать объект, а также допустимые действия, которые можно применять над объектом.

В языке C# есть следующие примитивные типы данных:

bool : хранит значение true или false (логические литералы). Представлен системным типом System.Boolean

byte : хранит целое число от 0 до 255 и занимает 1 байт. Представлен системным типом System.Byte

Читайте также:  Как изменить тип файла на windows 7

sbyte : хранит целое число от -128 до 127 и занимает 1 байт. Представлен системным типом System.SByte

short : хранит целое число от -32768 до 32767 и занимает 2 байта. Представлен системным типом System.Int16

ushort : хранит целое число от 0 до 65535 и занимает 2 байта. Представлен системным типом System.UInt16

int : хранит целое число от -2147483648 до 2147483647 и занимает 4 байта. Представлен системным типом System.Int32 . Все целочисленные литералы по умолчанию представляют значения типа int:

uint : хранит целое число от 0 до 4294967295 и занимает 4 байта. Представлен системным типом System.UInt32

long : хранит целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 и занимает 8 байт. Представлен системным типом System.Int64

ulong : хранит целое число от 0 до 18 446 744 073 709 551 615 и занимает 8 байт. Представлен системным типом System.UInt64

float : хранит число с плавающей точкой от -3.4*10 38 до 3.4*10 38 и занимает 4 байта. Представлен системным типом System.Single

double : хранит число с плавающей точкой от ±5.0*10 -324 до ±1.7*10 308 и занимает 8 байта. Представлен системным типом System.Double

decimal : хранит десятичное дробное число. Если употребляется без десятичной запятой, имеет значение от ±1.0*10 -28 до ±7.9228*10 28 , может хранить 28 знаков после запятой и занимает 16 байт. Представлен системным типом System.Decimal

char : хранит одиночный символ в кодировке Unicode и занимает 2 байта. Представлен системным типом System.Char . Этому типу соответствуют символьные литералы:

string : хранит набор символов Unicode. Представлен системным типом System.String . Этому типу соответствуют символьные литералы.

object : может хранить значение любого типа данных и занимает 4 байта на 32-разрядной платформе и 8 байт на 64-разрядной платформе. Представлен системным типом System.Object , который является базовым для всех других типов и классов .NET.

Например, определим несколько переменных разных типов и выведем их значения на консоль:

Для вывода данных на консоль здесь применяется интерполяция: перед строкой ставится знак $ и после этого мы можем вводить в строку в фигурных скобках значения переменных. Консольный вывод программы:

Использование суффиксов

При присвоении значений надо иметь в виду следующую тонкость: все вещественные литералы рассматриваются как значения типа double . И чтобы указать, что дробное число представляет тип float или тип decimal , необходимо к литералу добавлять суффикс: F/f — для float и M/m — для decimal.

Подобным образом все целочисленные литералы рассматриваются как значения типа int . Чтобы явным образом указать, что целочисленный литерал представляет значение типа uint, надо использовать суффикс U/u , для типа long — суффикс L/l , а для типа ulong — суффикс UL/ul :

Использование системных типов

Выше при перечислении всех базовых типов данных для каждого упоминался системный тип. Потому что название встроенного типа по сути представляет собой сокращенное обозначение системного типа. Например, следующие переменные будут эквивалентны по типу:

Неявная типизация

Ранее мы явным образом указывали тип переменных, например, int x; . И компилятор при запуске уже знал, что x хранит целочисленное значение.

Однако мы можем использовать и модель неявной типизации:

Для неявной типизации вместо названия типа данных используется ключевое слово var . Затем уже при компиляции компилятор сам выводит тип данных исходя из присвоенного значения. В примере выше использовалось выражение Console.WriteLine(c.GetType().ToString()); , которое позволяет нам узнать выведенный тип переменной с. Так как по умолчанию все целочисленные значения рассматриваются как значения типа int , то поэтому в итоге переменная c будет иметь тип int или System.Int32

Эти переменные подобны обычным, однако они имеют некоторые ограничения.

Во-первых, мы не можем сначала объявить неявно типизируемую переменную, а затем инициализировать:

Во-вторых, мы не можем указать в качестве значения неявно типизируемой переменной null :

Так как значение null, то компилятор не сможет вывести тип данных.

double или decimal

Из выше перечисленного списка типов данных очевидно, что если мы хотим использовать в программе числа до 256, то для их хранения мы можем использоват переменные типа byte . При использовании больших значений мы можем взять тип short, int, long. То же самое для дробных чисел — для обычных дробных чисел можно взять тип float, для очень больших дробных чисел — тип double. Тип decimal здесь стоит особняком в том плане, что несмотря на большую разрядность по сравнению с типом double, тип double может хранить большее значение. Однако значение decimal может содержать до 28 знаков после запятой, тогда как значение типа double — 15-16 знаков после запятой.

Decimal чаще находит применение в финансовых вычислениях, тогда как double — в математических операциях. Общие различия между этими двумя типами можно выразить следующей таблицей:

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.