Следующий код C #:
int n = 3;
double dbl = 1d / n;
decimal dec = 1m / n;
Console.WriteLine(dbl * n == 1d);
Console.WriteLine(dec * n == 1m);
выходы
True
False
Очевидно, что ни double
, ни decimal
не могут точно представлять 1/3. Но dbl * n
округляется до 1, а dec * n
- нет. Зачем? Где это поведение задокументировано?
UPDATE
Обратите внимание, что мой главный вопрос здесь , почему они ведут себя по-разному. Предполагая, что выбор округления был сознательным выбором, который был сделан при разработке IEEE 754 и .NET, я хотел бы знать, каковы причины выбора одного типа округления по сравнению с другим. В приведенном выше примере double
, кажется, работает лучше, получая математически правильный ответ, несмотря на то, что имеет меньше значащих цифр, чем decimal
. Почему создатели decimal
не использовали одно и то же округление? Существуют ли сценарии, когда существующее поведение decimal
будет более полезным?