Почему вы не можете назначить число с десятичной точкой десятичного типа напрямую без использования суффикса типа? не такое ли число считается числом типа десятичного?
decimal bankBalance = 3433.20; // ERROR!
Почему вы не можете назначить число с десятичной точкой десятичного типа напрямую без использования суффикса типа? не такое ли число считается числом типа десятичного?
decimal bankBalance = 3433.20; // ERROR!
Изменить. Возможно, я пропустил последнюю часть вопроса, поэтому обзор ниже вряд ли полезен.
В любом случае причина, по которой вы не можете сделать то, что вы пытаетесь сделать, заключается в том, что между типами с плавающей запятой и decimal
нет неявного преобразования. Однако вы можете назначить его из целого числа, поскольку существует неявное преобразование из int в десятичное.
Вы можете, но вы должны использовать этот синтаксис (или сделать явный приведение к десятичной).
decimal bankBalance = 3433.20m;
а для поплавков -
float bankBalance = 3433.20f;
по умолчанию double
double bankBalance = 3444.20;
Собственно, скрытая спецификация: вы можете: -p
decimal bankBalance = (decimal)3433.20;
Это действительно проанализировано компилятором как десятичное (не float и cast). См. IL, чтобы доказать это. Обратите внимание, что точность усекается, хотя (это имеет 1 десятичную цифру, а не 2, которые вы получаете от версии M
).
IL сгенерировано:
L_0001: ldc.i4 0x861c
L_0006: ldc.i4.0
L_0007: ldc.i4.0
L_0008: ldc.i4.0
L_0009: ldc.i4.1
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0
По сравнению с:
decimal bankBalance = 3433.20M;
Что генерирует:
L_0001: ldc.i4 0x53d18
L_0006: ldc.i4.0
L_0007: ldc.i4.0
L_0008: ldc.i4.0
L_0009: ldc.i4.2
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0
Единственное различие - десятичные цифры (1 против 2 и 10 соответственно)
Это
decimal bankBalance = 3433.20M;
будет работать. Причина в том, что float и decimal - очень разные типы. float даст вам очень близкое приближение числа, которое вы вводите, но десятичное число даст вам точное число. 99% времени, когда вы не заметите разницу, и должны просто использовать float.
Ваш ответ состоит из двух важных моментов:
Все числовые литералы с десятичной точкой, как предполагается, имеют тип double
компилятором С#, поэтому 3433.20
по умолчанию double
.
double
неявно конвертируются в decimal
, потому что хотя decimal
более точен, чем double
, он охватывает более короткий диапазон, поэтому переполнение возможно во время трансляции из от двойного до десятичного.
double
диапазон: ±(~10^−324 to 10^308)
с 15 или 16 значащими цифрами.
decimal
диапазон: ±(~10^-28 to 10^28)
с 28 или 29 значащими цифрами.
См. страницу MSDN на decimal, которая объясняет, что не существует неявного преобразования между нормальными типами float и десятичными.
Try
decimal bankBalance = 3433.20m;