Почему Double нельзя неявно приводить к десятичной дроби - PullRequest
27 голосов
/ 19 октября 2011

Я не понимаю правила приведения, когда дело доходит до десятичного и двойного.

Это допустимо

decimal dec = 10;
double doub = (double) dec;

Что меня смущает, так это то, что десятичная дробь - это 16-байтовый тип данных, а двойная - это 8 байтов, так что это не приведение двойного к десятичному расширениюразговор и, следовательно, должны быть разрешены неявно;с примером выше запрещено?

Ответы [ 3 ]

35 голосов
/ 19 октября 2011

Если вы конвертируете из double в decimal, вы можете потерять информацию - число может быть полностью вне диапазона, так как диапазон double намного больше диапазона decimal.

Если вы преобразуете из decimal в double, вы можете потерять информацию - например, 0.1 точно представимо в decimal, но не в double, а decimal на самом деле использует гораздо больше битов для точности чем double делает.

Неявные преобразования не должны терять информацию (преобразование из long в double может, но это другой аргумент). Если вы собираетесь потерять информацию, вы должны сообщить компилятору, что вам это известно, с помощью явного приведения.

Вот почему в любом случае нет неявных преобразований.

3 голосов
/ 19 октября 2011

Десятичная дробь точнее, поэтому вы потеряете информацию. Вот почему вы можете сделать это только явно. Это чтобы защитить вас от потери информации. См. MSDN

http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

1 голос
/ 19 октября 2011

Вы можете явно приводить в обоих направлениях: от double до decimal и от decimal до double.

Вы не можете неявно конвертировать в любом направлении по очень веской причине:конверсия не может быть без потерь.

Например, десятичное число 1234567890123456789 не может быть точно представлено как двойное число.Аналогично, двойное число 10^32 не может быть точно представлено как десятичное число.

Чтобы избежать непреднамеренной потери информации, неявное преобразование не разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...