Преобразование десятичного числа в двойное в C# приводит к разницеC#

Место общения программистов C#
Ответить
Anonymous
 Преобразование десятичного числа в двойное в C# приводит к разнице

Сообщение Anonymous »

Краткое описание проблемы:
Для некоторых десятичных значений, когда мы преобразуем тип из десятичного в двойной, к результату добавляется небольшая дробь.

Что еще хуже, так это то, что могут быть два «равных» десятичных значения, которые при преобразовании приводят к разным двойным значениям.

Пример кода:

Код: Выделить всё

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
Посмотрите на результаты в комментариях. Результаты копируются из часов отладчика.
Числа, которые производят этот эффект, имеют гораздо меньше десятичных цифр, чем предел типов данных, поэтому это не может быть переполнением (я думаю!).

Что делает его гораздо более интересным, так это то, что могут быть два равных[/b] десятичных значения (в приведенном выше примере кода см. «dcm» и «dcm2», где «deltaDcm» равно нулю), что приводит к различные значения double при преобразовании. (В коде "dbl" и "dbl2" имеют ненулевое значение "deltaDbl")

Я думаю, это должно быть связано с разницей в побитовом представлении чисел в двух типах данных, но не могу понять, с чем! И мне нужно знать, что делать, чтобы преобразование было таким, каким оно мне нужно. (например, dcm2 -> dbl2)

Подробнее здесь: https://stackoverflow.com/questions/158 ... difference
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»