C# является строго типизированным языком. В языках такого типа каждая переменная и константа имеет свой тип, результатом вычисления которого является некое значение. В стандартной библиотеке классов .NET определены встроенные числовые типы и комплексные типы. Об особенностях применения этих разных типов данных мы и поговорим в этой обзорной статье.
Содержание статьи:
1 Введение
1.1 Подразделение типов значения
1.2 Подразделение ссылочных типов
2. Использование суффиксов float, decimal, double
2.1 С# decimal VS double
2.2 Литералы
3. Decimal и float
4. C# convert to decimal
5. C# decimal to int
6. C# decimal round
7. Таблица некоторых типов C# и их сочетание с системными типами
8. Неявная типизация
9. Double или decimal?
9.1 Таблица различий между double и decimal
10 Итог
Типы данных используются для управления переменными. Каждый из типов данных обрабатывается в соответствии с определенными правилами. Поскольку C# — язык со строгой типизацией, то абсолютно все выполняемые операции проверяются на соответствие типов (во избежание ошибок производится их предварительный контроль). Если какая-либо операция с типами недопустима, итоговая программа не будет скомпилирована. По сути, разработка программного обеспечения на C# представляет собой создание и организацию взаимодействия между различными типами данных.
В языке C# типы данных имеют две категории:
byte, sbyte, short, ushort, int, uint, long, ulong);float, double);C# decimal;Bool;Char;enum;Struct.Object;String;Class;Interface;Delegate.У некоторых числовых типов имеются суффиксы, позволяющие записывать значение типа в переменную.
Числовые типы с плавающей запятой — это действительные числа. Они принадлежат к категории Типы значения. Это простые типы, которые могут быть инициализированы литералами. Они поддерживают операторы сравнения, равенства и арифметические операторы.
| Тип C# | Диапазон | Точность/Знаков после запятой | Размер/байт | Системный тип |
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# взаимозаменяемы с системными типами.
Пример:
double a = 12.3; System.Double b = 12.3;
Все типы с плавающей запятой имеют свои константы MaxValue и MinValue. Типы float и double в дополнение имеют константы, которые обозначают нечисловые и бесконечные значения.
С# decimal format подходит тогда, когда необходима точность, определяемая числом цифр справа от запятой. Числа с точностью до одной десятичной цифры наиболее точно обрабатывают тип decimal. В double или float в десятичных данных могут возникать ошибки.
В случаях, когда производительность важнее точности, тип decimal (c# format decimal) можно заменить типом double.
Тип определяется суффиксом:
double имеет суффиксы D или d;float имеет суффиксы F или f;decimal имеет суффиксы M или m.Пример:
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;
Decimal и float используются для хранения числовых значений:
Float является 32-битным типом данных с приблизительным числом. Не все значения в диапазоне типов данных могут быть точными, значения округляются;Decimal является 128-битным типом данных с фиксированной точностью. Все значения в диапазоне типов данных представлены с точностью и масштабом, значения не округляются;Decimal чаще всего используется в финансовых приложениях, требующих высокой точности без ошибок округления, а float используется для хранения чисел и повышения производительности.Класс convert создан для того, чтобы преобразовывать широкий спектр типов. С его помощью можно преобразовывать в десятичное число больше типов. Метод Convert.ToDecimal используется для преобразования строкового представления числа в эквивалентное десятичное число с информацией о форматировании.
Пример:
// C# program to demonstrate the
// Convert.ToDecimal() Method
using System;
using System.Globalization;
class GFG {
// Main Method
public static void Main()
{
try {
// creating object of CultureInfo
CultureInfo cultures = new CultureInfo("en-US");
// declaring and initializing String array
string[] values = {"123456789", "12345.6789",
"123,456,789.0123"};
// calling get() Method
Console.WriteLine("Converted decimal value "+
"of specified strings: ");
for (int j = 0; j < values.Length; j++) {
get(values[j], cultures);
}
}
catch (FormatException e) {
Console.WriteLine("\n");
Console.Write("Exception Thrown: ");
Console.Write("{0}", e.GetType(), e.Message);
}
catch (OverflowException e) {
Console.WriteLine("\n");
Console.Write("Exception Thrown: ");
Console.Write("{0}", e.GetType(), e.Message);
}
}
// Defining get() method
public static void get(string s,
CultureInfo cultures)
{
// converting string to specified char
decimal val = Convert.ToDecimal(s, cultures);
// display the converted char value
Console.Write(" {0}, ", val);
}
}
Вывод: преобразование в десятичное значение указанных строк:
123456789, 12345.6789, 123456789.0123.
Метод Decimal.ToInt32() создан для преобразования decimal значения в эквивалентное 32-разрядное целое число со знаком.
Пример:
/ C# program to demonstrate the
// Decimal.ToInt32(Decimal) Method
using System;
class GFG {
// Main Method
public static void Main()
{
try {
// Taking decimal variables
Decimal dec1 = 2147483647M;
Decimal dec2 = 21458565.2996m;
// using Decimal.ToInt32(Decimal) Method
// Here int means Int32
int val1 = Decimal.ToInt32(dec1);
// using Decimal.ToInt32(Decimal) Method
// Here int means Int32
int val2 = Decimal.ToInt32(dec2);
// Printing the Int32 value
Console.WriteLine("The Int32 value "
+ "is : {0}", val1);
// Printing the Int32 value
Console.WriteLine("The Int32 value "
+ "is : {0}", val2);
}
catch (OverflowException e)
{
Console.Write("Exception Thrown: ");
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
Вывод: Int32: 2147483647 и Int32: 21458565.
Decimal.Round() или С# round decimal представляет собой метод округления к ближайшему целому числу или указанному количеству десятичных знаков.
Существует 4 способа округления:
1Decimal round С# , то есть десятичный метод — Round(Decimal) Method — округление десятичного значения до ближайшего целого числа;
Пример:
// C# program to demonstrate the
// Decimal.Round(Decimal) Method
using System;
class GFG {
// Main Method
public static void Main()
{
try {
// Declaring and initializing value
decimal value = 184467440737095.51615M;
// getting rounded decimal
// using Round() method
decimal round = Decimal.Round(value);
// Display the value
Console.WriteLine("Rounded value is {0}", round);
}
catch (OverflowException e)
{
Console.WriteLine("Value must not be out of bound");
Console.Write("Exception Thrown: ");
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
Вывод: округленное значение 184467440737096.
2Round(Decimal, Int32) Method — округление значения Decimal до указанного количества десятичных знаков;
Пример:
// C# program to demonstrate the
// Decimal.Round(Decimal) Method
using System;
class GFG {
// Main Method
public static void Main()
{
try {
// Declaring and initializing value
decimal value = 7922816251426433759354.39503305M;
// getting rounded decimal
// using Round() method
decimal round = Decimal.Round(value, 4);
// Display the value
Console.WriteLine("Rounded value is {0}", round);
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine("decimal place is not within bound");
Console.Write("Exception Thrown: ");
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
Вывод: округленное значение 7922816251426433759354,3950.
3Round(Decimal, Int32, MidpointRounding) Method;
4Round(Decimal, MidpointRounding) Method.
Название встроенного типа (столбец Ключевое слово) — и есть сокращенное обозначение системного типа (столбец Системный тип).
| Ключевое слово | Системный тип | Описание и диапазон значений | Размер |
byte | System.Byte | Структура. Целое число 0…255. | 1 байт |
sbyte | System.SByte | Структура. Целое число -128…127. | 1 байт |
short | System.Int16 | Структура. Целое число -32768…32767. | 2 байта |
ushort | System.UInt16 | Структура. Целое число 0…65535. | 2 байта |
int | System.Int32 | Структура. Целое число -2147483648…2147483647. | 4 байта |
uint | System.UInt32 | Структура. Целое число 0…4294967295. | 4 байта |
long | System.Int64 | Структура. Целое число –9 223 372 036 854 775 808…9 223 372 036 854 775 807. | 8 байт |
ulong | System.UInt64 | Структура. Целое число 0…18 446 744 073 709 551 615. | 8 байт |
float | System.Single | Структура. Число с плавающей точкой -3.4*1038…3.4*1038 | 4 байта |
double | System.Double | Структура. Число с плавающей точкой ±5.0*10-324…±1.7*10308 | 8 байт |
decimal format c# | System.Decimal | Структура. Десятичное дробное число. Без десятичной запятой ±1.0*10-28…±7.9228*1028, хранит до 28 знаков после запятой. | 16 байт |
bool | System.Boolean | Структура. Хранит логические литералы true или false. | 1 байт |
char | System.Char | Структура. Хранит одиночный символ в Unicode. | 2 байта |
object | System.Object | Класс. Хранит значение любого типа данных. | — |
string | System.String | Класс. Хранит набор символов Unicode. | — |
Чтобы указать призвольный тип переменных, можно использовать неявную типизацию. Для этого используется ключевое слово var.
Пример:
var hello = "Привет, мир!";
var c = 20;
Console.WriteLine(c.GetType().ToString());
Console.WriteLine(hello.GetType().ToString());
Var используется вместо названия типа данных. Присвоенное значение позволяет компилятору выводить тип данных. В примере Console.WriteLine(c.GetType().ToString()); определяет тип переменной с. Целочисленные значения по умолчанию рассматриваются как int, поэтому переменная с имеет тип System.Int32.
Но такие переменные имеют свои ограничения:
1Нельзя определить неявную переменную и сразу ее инициализировать.
// верно int a; a = 20; // неверно var c; c = 20;
2Неявная переменная не может иметь значение null, в этом случае компилятор не определит автоматически тип данных.
// неверно var c=null;
Для больших дробных чисел проще всего использовать тип double. Decimal имеет большую разрядность в сравнении с double, но double хранит большее значение.
После запятой decimal может иметь до 28 цифр, тогда как double — до 16. Тем не менее double широко используется в математических вычислениях, а decimal — в финансовых.
| Максимальное значение | Минимальное значение | Цифр после запятой | Размер | Количество операций | |
double | ~10308 | ~10-323 | 16 | 8 байт | миллиарды в секунду |
decimal | ~1028 | 10-28 | 28 | 16 байт | сотни миллионов в секунду |
Типы данных могут быть простыми и сложными. Сложные типы чаще всего данные структурируют, а у простых значения данных неделимы. Любой язык программирования имеет систему встроенных типов данных, на их основе можно создавать свои производные.
В C# типы данных подразделяются на две большие группы:
struct ;class.Закрепить материал по типам C#-данных можно на основе этого замечательного видео, где дополняется все сказаное нами:
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…