Краткое описание проблемы:
Для некоторых десятичных значений, когда мы преобразуем тип из десятичной в двойную, в результат добавляется небольшая доля.
Что еще хуже, так это то, что при преобразовании могут быть два "равных" десятичных значения.
Пример кода:
decimal dcm = 8224055000.0000000000m; // dcm = 8224055000
double dbl = Convert.ToDouble(dcm); // dbl = 8224055000.000001
decimal dcm2 = Convert.ToDecimal(dbl); // dcm2 = 8224055000
double dbl2 = Convert.ToDouble(dcm2); // dbl2 = 8224055000.0
decimal deltaDcm = dcm2 - dcm; // deltaDcm = 0
double deltaDbl = dbl2 - dbl; // deltaDbl = -0.00000095367431640625
Посмотрите на результаты в комментариях. Результаты копируются из часов отладчика. Числа, которые производят этот эффект, имеют гораздо меньше десятичных цифр, чем предел типов данных, поэтому он не может быть переполнением (я думаю!).
Интересно то, что может быть два десятичных значения equal (в примере кода выше, см. "dcm" и "dcm2", при этом "deltaDcm" равен нулю), что приводит к в разные двойные значения при преобразовании. (В коде "dbl" и "dbl2", которые имеют ненулевой "deltaDbl" )
Я предполагаю, что это должно быть связано с различием в поразрядном представлении чисел в двух типах данных, но не может понять, что! И мне нужно знать, что делать, чтобы преобразовать, как мне это нужно. (например, dcm2 → dbl2)