Почему Double не может быть явно введено в Decimal
Я не понимаю правила кастинга, когда речь идет о десятичной и двойной.
Это законно делать это
decimal dec = 10;
double doub = (double) dec;
Что меня смущает, так это то, что десятичное число - это 16-байтовый тип данных, а double - 8 байт, поэтому он не отбрасывает двойное и десятичное расширение расширяющейся беседы и поэтому должно быть разрешено неявно; с приведенным выше примером запрещенным?
Ответы
Ответ 1
Если вы конвертируете с double
в decimal
, вы можете потерять информацию - номер может быть полностью вне допустимого диапазона, так как диапазон double
намного больше диапазона decimal
.
Если вы конвертируете из decimal
в double
, вы можете потерять информацию - например, 0,1 точно представлено в decimal
, но не в double
, а decimal
фактически использует намного больше бит для точности чем double
.
Неявные преобразования не должны терять информацию (может произойти преобразование из long
в double
, но это другой аргумент). Если вы собираетесь потерять информацию, вам следует сообщить компилятору, что вы знаете об этом, посредством явного приведения.
Вот почему нет неявных преобразований в любом случае.
Ответ 2
Десятичное значение более точно, поэтому вы потеряете информацию. Вот почему вы можете делать это явно. Это защитит вас от потери информации. См. MSDN
http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx
http://msdn.microsoft.com/en-us/library/364x0z75.aspx
Ответ 3
Вы можете явно указать в обоих направлениях: от double
до decimal
и от decimal
до double
.
Вы не можете неявно конвертировать в любом направлении по очень веской причине: преобразование не может быть потерянным.
Например, десятичное число 1234567890123456789 не может быть точно представлено как double. Аналогично, двойное число 10^32
не может быть точно представлено как десятичное число.
Чтобы избежать потери информации непреднамеренно, неявное преобразование не разрешено.