O que o M representa na notação literal decimal em C #?


312

Para trabalhar com tipos de dados decimais, eu tenho que fazer isso com inicialização variável:

decimal aValue = 50.0M;

O que a parte M representa?

Respostas:


387

Isso significa que é um literal decimal, como outros já disseram. No entanto, as origens provavelmente não são as sugeridas em outras partes desta resposta. Do padrão anotado em C # (a versão do ECMA, não a versão do MS):

O decimalsufixo é M / m desde que D / d já foi usado double. Embora tenha sido sugerido que M significa dinheiro, Peter Golde lembra que M foi escolhido simplesmente como a melhor melhor carta seguinte decimal.

Uma anotação semelhante menciona que as versões anteriores do C # incluíam "Y" e "S" para bytee shortliterais, respectivamente. Eles foram descartados por não serem úteis com muita frequência.


6
Isso deixa a questão de por que E / e não foi a próxima melhor carta.
VVS

61
"e" seria problemático porque já é usado em literais. Por exemplo "2e4m" é um literal válido (decimal 20000). Mesmo que não seja ambíguo (e pode muito bem ser, embora "1e" termine com uma curiosa mensagem de erro do compilador sugerindo que está fora da faixa de duplas viáveis, não que seja sintaticamente inválida; suspeito que seja um bug). confuso. "c" seria possivelmente fazer sentido sem causar qualquer confusão, embora, sem dúvida sugerem "moeda" para as pessoas :)
Jon Skeet

7
"c" entra em conflito com o caractere literal para cadeias de caracteres no VB.Net, embora mesmo lá a gramática seja um pouco diferente.
Joel Coehoorn

3
Eu não teria muito problema em ser diferente em C # e VB. O VB já possui uma sintaxe hexadecimal diferente, por exemplo, IIRC.
Jon Skeet

9
Se você definir as sílabas de "Decimal", obtém "De Ci Mal". Estes fazem mais sentido de usar. D já está em uso, C pode ser caracteres, M parece uma escolha lógica.
Aaron Franke

27

Nas especificações do 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

Observe que você pode usar uma notação maiúscula ou minúscula.


19

M refere-se ao primeiro caractere não ambíguo em "decimal". Se você não o adicionar, o número será tratado como um dobro.

D é o dobro.


4
Suponho que exista algum motivo importante, mas me irrita que você receba um erro em tempo de compilação se deixar o m fora do literal. Não é como se fosse ambíguo.
2100 SeaDrive

1
@JSON Funciona assim para tipos inteiros, porque não há ambiguidade lá - desde que ele se ajuste ao tipo, ele não perderá / não armazenará nenhuma informação. O mesmo não se aplica aos números decimais. A conversão do valor duplo 0.42em decimal pode fornecer um valor diferente de 0.42M(e o mesmo para o uso de um literal duplo no lugar de um literal flutuante - float val = 423.3também falha). Portanto, você escolhe entre um comportamento sutilmente errado e um erro do compilador que leva meio segundo para corrigir e estar em conformidade com os padrões CLR e C #.
Luaan 18/10/19

1
"M", como em "deciMal"
Shadi Namrouti 15/09/19

2

Um literal real com o sufixo M ou m é do tipo decimal. Por exemplo, os literais 1m, 1,5m, 1e10m e 123.456M são todos do tipo decimal. Esse literal é convertido em um valor decimal, obtendo o valor exato e, se necessário, arredondando para o valor representável mais próximo usando o arredondamento de banca. Qualquer escala aparente no literal é preservada, a menos que o valor seja arredondado ou o valor seja zero (nesse caso, o sinal e a escala serão 0). Portanto, o literal 2.900m será analisado para formar o decimal com o sinal 0, coeficiente 2900 e escala 3.

Leia mais sobre literais reais


0

Bem, acho que M representa a mantissa. O decimal pode ser usado para economizar dinheiro, mas isso não significa que o decimal é usado apenas para o dinheiro.


Isso é realmente um palpite, e é muito menos plausível do que a hipótese do "primeiro personagem não ambíguo disponível". Se você possui evidências de apoio, inclua-as em sua resposta.
Isherwood
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.