Cosa significa la M in notazione letterale decimale C #?


312

Per lavorare con tipi di dati decimali, devo farlo con l'inizializzazione variabile:

decimal aValue = 50.0M;

Cosa rappresenta la parte M?

Risposte:


387

Significa che è un valore decimale letterale, come altri hanno già detto. Tuttavia, le origini probabilmente non sono quelle suggerite altrove in questa risposta. Dallo standard annotato C # (la versione ECMA, non la versione MS):

Il decimalsuffisso è M / m poiché D / d era già stato preso da double. Sebbene sia stato suggerito che M sia sinonimo di denaro, Peter Golde ricorda che M è stata scelta semplicemente come la migliore lettera successiva decimal.

Un'annotazione simile menziona che le prime versioni di C # includevano rispettivamente "Y" e "S" per bytee shortletterali. Sono stati lasciati cadere per non essere utili molto spesso.


6
Questo lascia la domanda sul perché E / e non sia stata la prossima migliore lettera.
VVS,

61
"e" sarebbe problematico in quanto è già utilizzato nei letterali. Ad esempio "2e4m" è un valore letterale valido (decimale 20000). Anche se fosse inequivocabile (e potrebbe anche essere, anche se "1e" finisce con un curioso messaggio di errore del compilatore che suggerisce che è fuori dall'intervallo dei doppi praticabili, non che sia sintatticamente non valido; sospetto che sia un bug) sarebbe comunque confondendo. "c" avrebbe probabilmente senso senza creare confusione, anche se senza dubbio suggerirebbe "valuta" alle persone :)
Jon Skeet,

7
"c" è in conflitto con il carattere letterale per le stringhe in VB.Net, anche se anche lì la grammatica è leggermente diversa.
Joel Coehoorn,

3
Non avrei troppi problemi con il fatto che è diverso in C # e VB. VB ha già una sintassi esadecimale diversa, ad esempio IIRC.
Jon Skeet,

9
Se disponi le sillabe di "Decimale", otterrai "De Ci Mal". Questi hanno più senso da usare. D è già stata presa, C potrebbe essere un personaggio, M sembra una scelta logica.
Aaron Franke,

27

Dalle specifiche 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

Nota che puoi usare una notazione maiuscola o minuscola.


19

M si riferisce al primo carattere non ambiguo in "decimale". Se non lo aggiungi, il numero verrà trattato come un doppio.

D è doppia.


4
Suppongo che ci sia una ragione importante, ma mi irrita che tu ottenga un errore di compilazione se lasci la lettera fuori dal letterale. Non è come se fosse ambiguo.
SeaDrive,

1
@JSON Funziona in questo modo per i tipi di numeri interi, perché non c'è alcuna ambiguità lì - fintanto che si adatta al tipo, non perderà / altererà alcuna informazione. Lo stesso non vale per i numeri decimali. Lanciare il doppio valore 0.42in decimale può darti un valore diverso da 0.42M(e lo stesso per usare un doppio letterale al posto di un letterale float - float val = 423.3fallisce). Quindi stai scegliendo tra un comportamento leggermente sbagliato e un errore del compilatore che richiede mezzo secondo per essere riparato e conforme agli standard CLR e C #.
Luaan,

1
"M", come in "deciMal"
Shadi Namrouti,

2

Un vero letterale con il suffisso M o m è di tipo decimale. Ad esempio, i letterali 1m, 1.5m, 1e10m e 123.456M sono tutti di tipo decimale. Questo valore letterale viene convertito in un valore decimale prendendo il valore esatto e, se necessario, arrotondando al valore rappresentabile più vicino usando l'arrotondamento del banco. Qualsiasi scala apparente nel letterale viene conservata a meno che il valore non sia arrotondato o il valore sia zero (in questo caso il segno e la scala saranno 0). Quindi, i 2.900m letterali verranno analizzati per formare il decimale con segno 0, coefficiente 2900 e scala 3.

Leggi di più sui veri letterali


0

Beh, immagino che M rappresenti la mantissa. Il decimale può essere utilizzato per risparmiare denaro, ma non significa che il decimale viene utilizzato solo per denaro.


Questa è davvero un'ipotesi, ed è molto meno plausibile dell'ipotesi del "primo personaggio non ambiguo disponibile". Se hai prove a sostegno, includile nella tua risposta.
Isherwood,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.