Що означає M у буквальному позначенні C # Десяткові?


311

Для роботи з десятковими типами даних я повинен це зробити із ініціалізацією змінної:

decimal aValue = 50.0M;

Що означає частина М?

Відповіді:


386

Це означає, що це десяткова буква, як казали інші. Однак витоки, мабуть, не ті, що запропоновані в цій відповіді деінде. З анотаційного стандарту C # (версія ECMA, а не версія MS):

decimalСуфікс М / м , так як D / D вже прийнято double. Хоча було висловлено припущення, що M - це гроші, гроші Пітер Голде нагадує, що M був обраний просто як наступний найкращий лист у decimal.

У подібній анотації згадується, що ранні версії C # включали "Y" і "S" для byteта shortлітерали відповідно. Їх відкидали, не дуже корисні.


6
Це залишає питання, чому E / e не був наступним найкращим листом.
VVS

61
"е" було б проблематичним, оскільки воно вже використовується в літералах. Наприклад, "2e4m" є допустимим буквальним знаком (десятковий 20000). Навіть якби це було однозначно (і це може бути, хоча "1e" закінчується цікавим повідомленням про помилку компілятора, що говорить про те, що він знаходиться поза діапазоном життєздатних подвійних, не те, що це синтаксично недійсне; я підозрюю, що це помилка) все одно було б заплутаний. "c", можливо, має сенс, не викликаючи плутанини, хоча це, без сумніву, пропонує людям "валюту" :)
Jon Skeet

7
"c" конфліктує з буквою символів для рядків у VB.Net, хоча навіть там граматика дещо інша.
Джоель Куехорн

3
У мене не було б надто багато проблем з тим, щоб він відрізнявся у C # та VB. VB вже має різні шістнадцяткові синтаксиси, наприклад, IIRC.
Джон Скіт

9
Якщо викладете склади «Десяткової», ви отримаєте «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 подвійний.


4
Я припускаю, що є якась важлива причина, але мене це дратує, що ви отримуєте помилку під час компіляції, якщо ви залишаєте m з буквального. Це не так, як це неоднозначно.
SeaDrive

1
@JSON Це працює таким чином для цілих типів, тому що там немає ніякої неоднозначності - доки він відповідає типу, він не втратить / не видасть жодної інформації. Те саме не стосується десяткових чисел. Передача подвійного значення 0.42в десятковий може дати вам інше значення, ніж 0.42M(і те ж саме для використання подвійного літералу замість поплавкового букваря - float val = 423.3також не вдається). Таким чином, ви вибираєте між тонко неправильною поведінкою та помилкою компілятора, який потребує півсекунди для виправлення та відповідності стандартам CLR та C #.
Луань

1
"М", як у "deciMal"
Шаді Намроуті

2

Справжній буквальний суфікс M або m має десятковий тип. Наприклад, літерали 1м, 1,5м, 1е10м і 123,456М - всі десятичні типи. Цей буквальний перетворюється в десяткове значення шляхом взяття точного значення і, якщо необхідно, округлення до найближчого представного значення за допомогою округлення банкіра. Будь-яка шкала, видима в прямому значенні, зберігається, якщо значення не округлене або значення дорівнює нулю (в останньому випадку знак і шкала будуть дорівнює 0). Отже, буквальні 2 900 м будуть проаналізовані, щоб утворити десятковий знак зі знаком 0, коефіцієнтом 2900 та шкалою 3.

Детальніше про справжні літерали


0

Ну, я здогадуюсь, M представляє мантію. Десяткові знаки можна використовувати для економії грошей, але це не означає, що десяткові використовуються лише для грошей.


Це справді здогадка, і це набагато менш правдоподібно, ніж гіпотеза про "перший доступний неоднозначний характер". Якщо у вас є підтверджуючі докази, включіть їх у свою відповідь.
Ізервуд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.