¿Qué significa la M en notación literal decimal C #?

312

Para trabajar con tipos de datos decimales, tengo que hacer esto con inicialización variable:

decimal aValue = 50.0M;

¿Qué significa la parte M?

coson
fuente

Respuestas:

387

Significa que es un literal decimal, como han dicho otros. Sin embargo, los orígenes probablemente no sean los sugeridos en otra parte de esta respuesta. Desde el estándar anotado C # (la versión ECMA, no la versión MS):

El decimalsufijo es M / m ya que D / d ya fue tomado por double. Aunque se ha sugerido que M significa dinero, Peter Golde recuerda que M fue elegida simplemente como la siguiente mejor letra decimal.

Una anotación similar menciona que las primeras versiones de C # incluían "Y" y "S" para bytey shortliterales respectivamente. Se dejaron caer por no ser útiles muy a menudo.

Jon Skeet
fuente
66
Eso deja la pregunta de por qué E / e no fue la siguiente mejor carta.
VVS
61
"e" sería problemático porque ya se usa en literales. Por ejemplo, "2e4m" es un literal válido (decimal 20000). Incluso si no fuera ambiguo (y bien puede serlo, aunque "1e" termina con un curioso mensaje de error del compilador que sugiere que está fuera del rango de dobles viables, no es que sea sintácticamente inválido; sospecho que es un error) todavía sería confuso. "c" posiblemente tendría sentido sin causar confusión, aunque sin duda sugeriría "moneda" a las personas :)
Jon Skeet
77
"c" entra en conflicto con el carácter literal de las cadenas en VB.Net, aunque incluso allí la gramática es un poco diferente.
Joel Coehoorn
3
No tendría demasiado problema con que sea diferente en C # y VB. VB ya tiene una sintaxis hexadecimal diferente, por ejemplo, IIRC.
Jon Skeet
99
Si diseñas las sílabas de "Decimal", obtienes "De Ci Mal". Estos tienen más sentido para usar. D ya está en uso, C podría ser caracteres, M parece una elección lógica.
Aaron Franke
27

De las especificaciones de 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

Tenga en cuenta que puede usar una notación mayúscula o minúscula.

Shadi Namrouti
fuente
19

M se refiere al primer carácter no ambiguo en "decimal". Si no lo agrega, el número se tratará como un doble.

D es doble.

MDStephens
fuente
44
Supongo que hay alguna razón importante, pero me irrita que obtenga un error en tiempo de compilación si deja el m fuera del literal. No es como si fuera ambiguo.
SeaDrive 01 de
1
@ JSON Funciona de esa manera para los tipos enteros, porque no hay ambigüedad allí, siempre y cuando se ajuste al tipo, no perderá / confunde ninguna información. Lo mismo no es cierto para los números decimales. Convertir el valor doble 0.42a decimal puede darle un valor diferente que 0.42M(y lo mismo para usar un doble literal en lugar de un literal flotante, float val = 423.3también falla). Entonces, está eligiendo entre un comportamiento sutilmente incorrecto y un error del compilador que tarda medio segundo en solucionarse y se ajusta a los estándares CLR y C #.
Luaan
1
"M", como en "deciMal"
Shadi Namrouti
2

Un literal real con sufijo M o m es de tipo decimal. Por ejemplo, los literales 1m, 1.5m, 1e10m y 123.456M son todos de tipo decimal. Este literal se convierte en un valor decimal tomando el valor exacto y, si es necesario, redondeando al valor representable más cercano usando el redondeo bancario. Cualquier escala aparente en el literal se conserva a menos que el valor se redondee o el valor sea cero (en este último caso, el signo y la escala serán 0). Por lo tanto, el literal 2.900m se analizará para formar el decimal con el signo 0, el coeficiente 2900 y la escala 3.

Leer más sobre literales reales

LuckyBrain
fuente
0

Bueno, supongo que M representa la mantisa. El decimal se puede usar para ahorrar dinero, pero no significa que el decimal solo se use para el dinero.

Ashvani mishra
fuente
De hecho, es una suposición, y es mucho menos plausible que la hipótesis del "primer personaje no ambiguo disponible". Si tiene evidencia de apoyo, inclúyala en su respuesta.
isherwood