Есть ли причина что Система C#. 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 помнит, что вводился с дополнительным нулем. Какова причина/цель этого?
Может быть полезно представлять число включая его точность - так 0.5m может использоваться для обозначения "все, что между 0.45m и 0.55m" (с соответствующими ограничениями) и 0.50m может использоваться для обозначения "все, что между 0.495m и 0.545m".
Я подозреваю, что большинство разработчиков на самом деле не используют эту функциональность, но я вижу, как она может быть иногда полезна.
Я считаю, что эта возможность впервые появилась в .NET 1.1 - я думаю, что десятичные числа в 1.0 всегда эффективно нормализовались.
Десятичные дроби представляют собой десятичные значения с фиксированной точностью. Литеральное значение 0.50M
имеет встроенную точность 2 десятичных разряда, и поэтому созданная десятичная переменная запоминает, что это значение 2 десятичных разряда. Поведение полностью задуманно.
Сравнение значений - это точная проверка числового равенства значений, поэтому здесь завершающие нули не влияют на результат.
Я думаю, что это было сделано для лучшего внутреннего представления числовых значений, полученных из баз данных. Механизмы базы данных имеют долгую историю хранения чисел в десятичном формате (избегая ошибок округления) с явной спецификацией количества цифр в значении.
Сравните, например, типы десятичных и числовых столбцов SQL Server .