Подтвердить что ты не робот

Почему С# 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 помнит, что он был введен с дополнительным нулем. В чем причина/цель для этого?

4b9b3361

Ответ 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 десятичные и числовые типы столбцов, например.