Почему С# System.Decimal запоминает конечные нули?
Есть ли причина, по которой С# System.Decimal запоминает количество завершающих нулей, с которыми оно было введено?
См. Следующий пример:
public void DoSomething()
{
decimal dec1 = 0.5M;
decimal dec2 = 0.50M;
Console.WriteLine(dec1); //Output: 0.5
Console.WriteLine(dec2); //Output: 0.50
Console.WriteLine(dec1 == dec2); //Output: True
}
Десятичные числа классифицируются как равные, но dec2 помнит, что он был введен с дополнительным нулем. В чем причина/цель для этого?
Ответы
Ответ 1
Может быть полезно представить число, включая его точность, поэтому 0,5 м можно использовать для обозначения "что-то между 0,45 м и 0,55 м" (с соответствующими ограничениями), а 0,50 м может использоваться для обозначения "всего 0,495 м и 0,545 м".
Я подозреваю, что большинство разработчиков фактически не используют эту функциональность, но я могу видеть, как это может быть полезно иногда.
Я считаю, что эта способность впервые появилась в .NET 1.1, btw - я думаю, что десятичные числа в 1.0 всегда были эффективно нормализованы.
Ответ 2
Десятичные числа представляют десятичные значения с фиксированной точностью. Литеральное значение 0.50M
имеет встроенную точность с точностью до 2 знаков после запятой, поэтому созданная десятичная переменная помнит, что это значение в 2 десятичных знака. Поведение полностью по дизайну.
Сравнение значений - это точная количественная проверка равенства на значениях, поэтому здесь конечные нули не влияют на результат.
Ответ 3
Я думаю, что это было сделано, чтобы обеспечить лучшее внутреннее представление для числовых значений, полученных из баз данных. У двигателей Dbase есть длинная история хранения чисел в десятичном формате (исключая ошибки округления) с явной спецификацией количества цифр в значении.
Сравните SQL Server десятичные и числовые типы столбцов, например.