Что означает M в десятичной литеральной записи C #?

312

Чтобы работать с десятичными типами данных, я должен сделать это с инициализацией переменной:

decimal aValue = 50.0M;

Что означает М-часть?

Coson
источник

Ответы:

387

Это означает, что это десятичный литерал, как уже говорили другие. Тем не менее, происхождение, вероятно, не те, которые предлагаются в другом месте в этом ответе. Из Аннотированного стандарта C # (версия ECMA, а не версия MS):

decimalСуффикс М / м , так как D / D уже принято double. Хотя было высказано предположение, что М означает деньги, Питер Голде напоминает, что М был выбран просто в качестве следующего лучшего письма в decimal.

В аналогичной аннотации упоминается, что ранние версии C # включали «Y» и «S» для byteи shortлитералов соответственно. Они были отброшены на том основании, что они не очень полезны.

Джон Скит
источник
6
Это оставляет вопрос, почему E / e не было следующей лучшей буквой.
ВВС
61
«е» было бы проблематично в том смысле, что оно уже используется в литералах. Например, «2e4m» является допустимым литералом (десятичное 20000). Даже если бы он был однозначным (и вполне может быть, хотя «1e» заканчивается любопытным сообщением об ошибке компилятора, указывающим на то, что он выходит за пределы допустимых двойных значений, а не на то, что это синтаксически неверно; я подозреваю, что это ошибка), это все равно будет запутанный. «с», возможно, имело бы смысл, не вызывая путаницы, хотя, несомненно, предлагало бы «валюту» людям :)
Джон Скит
7
«c» конфликтует с символьным литералом для строк в VB.Net, хотя даже там грамматика немного отличается.
Джоэл Коухорн
3
У меня не было бы слишком большой проблемы с этим, отличающимся в C # и VB. VB уже имеет другой шестнадцатеричный синтаксис, например, IIRC.
Джон Скит
9
Если вы выложите слоги "Decimal", вы получите "De Ci Mal". Это имеет смысл использовать. D уже занят, C может быть символами, M кажется логичным выбором.
Аарон Франке
27

Из спецификации C #:

var f = 0f; // float
var d = 0d; // double
var m = 0m; // decimal (money)
var u = 0u; // unsigned int
var l = 0l; // long
var ul = 0ul; // unsigned long

Обратите внимание, что вы можете использовать прописные или строчные записи.

Шади Намроути
источник
19

М относится к первому не двусмысленному символу в «десятичном». Если вы не добавите его, число будет считаться двойным.

D двойной.

MDStephens
источник
4
Я полагаю, что есть какая-то важная причина, но меня раздражает, что вы получаете ошибку во время компиляции, если вы оставляете m вне литерала. Это не так, как будто это неоднозначно.
SeaDrive
1
@JSON Это работает для целочисленных типов, потому что там нет никакой двусмысленности - пока он соответствует типу, он не потеряет / искажет любую информацию. То же самое не относится к десятичным числам. Преобразование двойного значения 0.42в десятичное может дать вам значение, отличное от 0.42M(и то же самое для использования двойного литерала вместо литерала с плавающей запятой - float val = 423.3также не удается). Таким образом, вы выбираете между слегка неправильным поведением и ошибкой компилятора, для исправления которой требуется полсекунды и которая соответствует стандартам CLR и C #.
Луаан
1
«М», как в «deciMal»
Шади Намрути
2

Действительный литерал с суффиксом M или m имеет тип decimal. Например, литералы 1m, 1.5m, 1e10m и 123.456M имеют десятичный тип. Этот литерал преобразуется в десятичное значение путем получения точного значения и, при необходимости, округления до ближайшего представимого значения с использованием округления банкира. Любая шкала, видимая в литерале, сохраняется, если только значение не округлено или значение не равно нулю (в этом случае знак и масштаб будут равны 0). Следовательно, литерал 2.900m будет проанализирован для формирования десятичной дроби со знаком 0, коэффициентом 2900 и шкалой 3.

Узнайте больше о реальных литералах

LuckyBrain
источник
0

Ну, я думаю, М представляют мантиссу. Десятичная дробь может использоваться для экономии денег, но это не значит, что десятичная дробь используется только для денег.

Ашвани Мишра
источник
Это действительно предположение, и оно гораздо менее правдоподобно, чем гипотеза «первый доступный не двусмысленный характер». Если у вас есть подтверждающие доказательства, включите их в свой ответ.
Ишервуд