Почему двойное округление и десятичное нет? - PullRequest
0 голосов
/ 08 ноября 2018

Следующий код 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 будет более полезным?

1 Ответ

0 голосов
/ 08 ноября 2018

тест:

int n = 3;
double  dbl = 1d / n;
decimal dec = 1m / n;

Console.WriteLine("/n");
Console.WriteLine(dbl);
Console.WriteLine(dec);

Console.WriteLine("*n");
Console.WriteLine(dbl * n);
Console.WriteLine(dec * n);

результат:

/n
0.333333333333333
0.3333333333333333333333333333
*n
1
0.9999999999999999999999999999

десятичное число сохраняется с основанием 10, двойное и однозначное - основание 2. вероятно, для двойного после 3 * 0,333333333333333 в процессоре будет двоичная перегрузка и результат 1. но 3 * 0,3 --- 3 с основанием 10 - без перегрузки, результат 0,9 --- 9

...