Подтвердить что ты не робот

Почему вы не можете назначить число с десятичной точкой на десятичный тип напрямую без использования суффикса типа?

Почему вы не можете назначить число с десятичной точкой десятичного типа напрямую без использования суффикса типа? не такое ли число считается числом типа десятичного?

decimal bankBalance = 3433.20; // ERROR!
4b9b3361

Ответ 1

Изменить. Возможно, я пропустил последнюю часть вопроса, поэтому обзор ниже вряд ли полезен.

В любом случае причина, по которой вы не можете сделать то, что вы пытаетесь сделать, заключается в том, что между типами с плавающей запятой и decimal нет неявного преобразования. Однако вы можете назначить его из целого числа, поскольку существует неявное преобразование из int в десятичное.


Вы можете, но вы должны использовать этот синтаксис (или сделать явный приведение к десятичной).

decimal bankBalance = 3433.20m;

а для поплавков -

float bankBalance = 3433.20f;

по умолчанию double

double bankBalance = 3444.20;

Ответ 2

Собственно, скрытая спецификация: вы можете: -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 соответственно)

Ответ 3

Это

decimal bankBalance = 3433.20M;

будет работать. Причина в том, что float и decimal - очень разные типы. float даст вам очень близкое приближение числа, которое вы вводите, но десятичное число даст вам точное число. 99% времени, когда вы не заметите разницу, и должны просто использовать float.

Ответ 4

Ваш ответ состоит из двух важных моментов:

  • Все числовые литералы с десятичной точкой, как предполагается, имеют тип double компилятором С#, поэтому 3433.20 по умолчанию double.

    Номера
  • double неявно конвертируются в decimal, потому что хотя decimal более точен, чем double, он охватывает более короткий диапазон, поэтому переполнение возможно во время трансляции из от двойного до десятичного.

double диапазон: ±(~10^−324 to 10^308) с 15 или 16 значащими цифрами.

decimal диапазон: ±(~10^-28 to 10^28) с 28 или 29 значащими цифрами.

Ответ 5

См. страницу MSDN на decimal, которая объясняет, что не существует неявного преобразования между нормальными типами float и десятичными.

Try

decimal bankBalance = 3433.20m;