я знал, что десятичный тип более точен, чем float, поэтому я думаю, что должно быть разумно, чтобы преобразование float в decimal было похоже на преобразование float в double. Но на самом деле это не так.
float a = 1.1f;
double d = a;
decimal c = (decimal)d; // true
decimal e = (decimal)a; // true
decimal f = a; // error
float
имеет приблизительный диапазон от ± 1,5 x 10 −45 до ± 3,4 x 10 38.
и точность 6-9 цифр.decimal
имеет приблизительный диапазон от ± 1,0 x 10 -28 до ± 7,9228 x 10 28 и точность 28-29 цифр.Это вызовет исключение для присвоения float
decimal
, если float
находится за пределами десятичного диапазона.
Поэтому вы получите ошибку компиляции, если попытаетесь сделать это без кастинга. В таких случаях C# проявляет осторожность.
Здесь мы можем увидеть разницу между диапазоном и точностью.
float
имеет больший диапазон, чем decimal
, а decimal
имеет большую точность, чем float
.
(Обратите внимание, что вы также получите ошибку компиляции, если попытаетесь присвоить decimal
float
без приведения, но на этот раз потому, что это может привести к потере данных, а не потому, что это вызовет исключение.)
Это (попытка преобразовать число с плавающей запятой вне диапазона в десятичное число) на самом деле вызывает не потерю данных, а исключение.
Пожалуйста, ознакомьтесь с правилами публикации на этом сайте. Вы не должны размещать теги (например,
[C#]
) в заголовке вопроса, так как на сайте уже есть подходящая система тегов.