Какова цель двойного подразумевания?

например:

const decimal dollars = 25.50M;

почему мы должны добавить, что M?

почему бы просто не сделать:

const decimal dollars = 25.50;

поскольку он уже говорит decimal, не означает ли это, что 25.50 является десятичным?

Ответы

Ответ 1

Нет.

25.50 является автономным выражением типа double, а не decimal.
Компилятор не увидит, что вы пытаетесь назначить его переменной decimal и интерпретировать ее как десятичную.

За исключением лямбда-выражений, анонимных методов и условного оператора, все выражения С# имеют фиксированный тип, который вообще не зависит от контекста.

Представьте, что произойдет, если компилятор сделает то, что вы хотите, и вы вызвали Math.Max(1, 2).
Math.Max имеет перегрузки, которые принимают int, double и decimal. Какой из них он назвал бы?

Ответ 2

В этой ситуации есть два важных понятия.

  • Литеральные значения
  • Неявное преобразование

По сути, вы спрашиваете, может ли буквальное значение быть неявно преобразовано между двумя типами. Компилятор действительно сделает это для вас в некоторых случаях, когда не будет потери точности. Возьмите это, например:

long n = 1000; // Assign an Int32 literal to an Int64.

Это возможно, потому что long (Int64) содержит больший диапазон значений по сравнению с int (Int32). Для вашего конкретного примера можно потерять точность. Вот радикально разные диапазоны для decimal и double.

Decimal: ±1.0 × 10−28 to ±7.9 × 1028
Double: ±5.0 × 10−324 to ±1.7 × 10308

Благодаря знаниям становится понятным, почему неявное преобразование - плохая идея. Ниже приведен список неявных преобразований, которые в настоящее время поддерживает компилятор С#. Я настоятельно рекомендую вам немного почитать информацию по этому вопросу.

Таблица нечетных числовых преобразований

Ответ 3

Обратите также внимание на то, что из-за внутренних подробностей о том, как определяются удвоения и десятичные знаки, в ваших заданиях или вычислениях могут появляться небольшие ошибки округления. Вам нужно знать, как float, doubles и decimals работают на уровне бит, чтобы всегда делать лучший выбор.

Например, double не может точно сохранить значение 25.10, но может быть десятичным.

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

Десятичная структура