TOC

This article has been localized into Russian by the community.

Введение:

Плаваяющая точка

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

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

double number;

Так же, как целое число, вы можете, конечно, присвоить ему значение в то же время, как объявление его:

double number = 42.0;

То же самое касается типов float и decimal, о которых мы поговорим буквально через секунду, но здесь обозначения немного отличаются:

double doubleVal = 42.0;
float floatVal = 42.0f;
decimal decimalVal = 42.0m;

Обратите внимание на "f" и " m " после чисел - это говорит компилятору, что мы присваиваем float и десятичное значение. Без него C# будет интерпретировать числа как double, который не может быть автоматически преобразован ни в float, ни в decimal.

float, double или decimal?

Работа со значениями с плавающей запятой в программировании всегда вызывала много вопросов и проблем. Например, C# имеет по крайней мере три типа данных для работы с нецелыми / нецелыми числами:

  • float(псевдоним System.Single)
  • double(псевдоним System.Double)
  • decimal(псевдоним System.Decimal)

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

В общем случае разница между типами данных float, double и decimal заключается в точности и, следовательно, в объеме памяти, используемой для их хранения. float является наименее затратным - он может представлять собой число до 7 цифр. double более точен, До 16 знаками, десятичная дробь самая точная, аж до максимумом в 29 знаков.

Вы можете задаться вопросом, для чего вам нужна вся эта точность, но ответ - "математика". Классический пример, чтобы понять разницу деления 10 на 3. Большинство из нас сделает это в голове и скажет, что результат 3.33, но многие люди также знают, что это не совсем точно. Реальный ответ 3.33, а затем количество дополнительных 3-ек - сколько, при выполнении этого расчета с c#, определяется типом данных. Проверьте этот пример:

float a = 10f / 3;
Console.WriteLine(a);
double b = 10d / 3;
Console.WriteLine(b);
decimal c = 10m / 3;
Console.WriteLine(c);

Я произвожу точно такие же вычисления, но с различными типами данных. Результат будет выглядеть следующим образом:

a: 3.333333
b: 3.33333333333333
c: 3.3333333333333333333333333333

Разница довольно ясна, но сколько точности вычисления вам действительно нужно для большинства задач?

Как выбрать

Прежде всего, вы должны учитывать, сколько знаков вам нужно хранить. float может содержать только 7 цифр, так что если вам нужно большее число, вы можете пойти с double или decimal вместо этого.

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

Таким образом, для ситуаций, где точность является основной проблемой, вы должны применять тип decimal . Отличный пример для представления финансовых чисел (денег) - вы не хотите добавлять 10 сумм в свой Бухгалтерский учет, просто чтобы узнать, что результат не такой, как вы ожидали. С другой стороны, если производительность более важна, вы должны применить float (для небольших чисел) или double (для больших чисел). A decimal , благодаря своей дополнительной точности, намного медленнее, чем float - некоторые тесты показывают, что он до 20 раз медленнее!

Резюме

При работе со значениями с плавающей запятой следует использовать тип данных float или double , когда точность менее важна, чем производительность. С другой стороны, если вы хотите получить максимальную точность и готовы принять более низкий уровень производительности, следует использовать тип данных decimal, особенно при работе с финансовыми числами.

Если вы хотите узнать больше об основных различиях между этими типами данных на более детальном уровне, ознакомьтесь с этой очень подробной статьей: What Every Computer Scientist Should Know About Floating-Point Arithmetic

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!