VirQ. Приведение дробных типов в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная / Приведение типов /
Приведение дробных типов
Статей на сайте: 61

Приведение дробных типов


Есть 3 типа дробных чисел в C# - double, float, decimal. В первой половине статьи приводится разница между ними. Ниже примеры приведения.
В таком случае разницы нет, что вы будете использовать:
[code] double a = 15.767234; float c = 15.767234f; decimal b = 15.767234m; [/code]
Обратите внимание, что для decimal типа в конце числа ставится буква "m". Для float-типа ставится буква "f".
По умолчанию double - это базовый тип. Т.е. число 10,5 без буквы, это double. Для double числа можно использовать букву "d". Можно, но нет смысла, так как без буквы число и воспринимается, как тип double.
[code] double a = 15.767234; double a = 15.767234d; [/code]
Давайте разберём разницу между ними.

Тип double

Его диапазон ±1.79769308 с точностью после запятой 4.94066-324.
Этот диапазон может вмещать в себя диапазон float.
Поэтому явное приведение типа не требуется:
[code] float b = 15.767234f; double a = b; [/code]
Однако наоборот - нужно:
[code] double b = 15.767234; float a = (float)b; [/code]
Таким образом мы ограничиваем double тип до границ float-типа.

Тип float

Диапазон float находится в таких границах, как ±3.4028238 с точностью после запятой 1.4013-45.
[code] float a = 15.00001f; float b = 10.99998f; Console.WriteLine(a + b); //Результат 25,99999 Console.ReadKey(); [/code]
Однако стоит изменить кол-во чисел после запятой, мы получаем уже искажённый результат:
[code] float a = 15.00001f; float b = 10.99998f; Console.WriteLine(a + b); //Результат 26 Console.ReadKey(); [/code]
Но стоит float заменить на double, получим верный ответ (не забываем, что в конце числа не должно быть буквы, или должна быть буква "d"):
[code] double a = 15.000001; double b = 10.999998; Console.WriteLine(a + b); //Результат 25,999999 Console.ReadKey(); [/code]
Продолжая увеличивать число экспериментальным путём видим предел:
[code] double a = 15.0000000000001; double b = 10.9999999999998; Console.WriteLine(a + b); //Результат 25,9999999999999 Console.ReadKey(); [/code]
Вообще в вычислениях у float только 8 значащих цифр, независимо от запятой.
У double - 15-16 цифр.

Тип decimal

Это самый точный и самый медленный дробный тип. Он медленнее в 15 раз раз, чем double или float. Его медлительность наблюдается при вычислениях в несколько десятков миллионов операций.
Его точность составляет 28-29 цифр.
[code] decimal a = 15.000000000000000000000000001m; decimal b = 10.999999999999999999999999998m; Console.WriteLine(a + b); //Результат 25,999999999999999999999999999 Console.ReadKey(); Console.ReadKey(); [/code]
Это наибольшее количество цифр после запятой, когда мы видим верный результат.

Примеры приведения типов (явных (большее к меньшему) и неявный (меньшее к большему))

[code] double a = 15.12345; float b = (float)a; double a = 15.12345; decimal b = (decimal)a; float a = 15.12345f; double b = a; //Неявное приведение, т.е. автоматическое float a = 15.12345f; decimal b = (decimal)a; decimal a = 15.12345m; float b = (float)a; decimal a = 15.12345m; double b = (double)a; [/code]

Дополнительная информация о том, как вывести результат в консоли или WinForm