Apa artinya M dalam C # Notasi literal desimal?


312

Untuk dapat bekerja dengan tipe data desimal, saya harus melakukan ini dengan inisialisasi variabel:

decimal aValue = 50.0M;

Apa artinya bagian M berdiri?

Jawaban:


387

Itu berarti desimal literal, seperti yang dikatakan orang lain. Namun, asal usulnya mungkin bukan yang disarankan di tempat lain dalam jawaban ini. Dari C # Beranotasi Standar (versi ECMA, bukan versi MS):

The decimalakhiran M / m sejak D / d sudah diambil oleh double. Walaupun dikatakan bahwa M berarti uang, Peter Golde ingat bahwa M dipilih hanya sebagai surat terbaik berikutnya decimal.

Anotasi serupa menyebutkan bahwa versi awal C # termasuk "Y" dan "S" untuk bytedan shortliteral masing-masing. Mereka dijatuhkan dengan alasan tidak terlalu berguna.


6
Itu meninggalkan pertanyaan mengapa E / e bukan huruf terbaik berikutnya.
VVS

61
"e" akan bermasalah karena sudah digunakan dalam literal. Misalnya "2e4m" adalah literal yang valid (desimal 20000). Bahkan jika itu tidak ambigu (dan mungkin juga, meskipun "1e" berakhir dengan pesan kesalahan kompiler penasaran menyarankan itu di luar kisaran ganda yang layak, bukan karena secara sintaks tidak valid; Saya menduga itu bug) itu masih akan menjadi membingungkan. "c" mungkin akan masuk akal tanpa menyebabkan kebingungan, meskipun akan ada keraguan menyarankan "mata uang" untuk orang :)
Jon Skeet

7
"c" konflik dengan karakter literal untuk string di VB.Net, meskipun bahkan tata bahasanya sedikit berbeda.
Joel Coehoorn

3
Saya tidak akan memiliki terlalu banyak masalah dengan itu menjadi berbeda di C # dan VB. VB sudah memiliki sintaks hex yang berbeda misalnya, IIRC.
Jon Skeet

9
Jika Anda mengeluarkan suku kata dari "Desimal", Anda mendapatkan "De Ci Mal". Ini paling masuk akal untuk digunakan. D sudah diambil, C bisa jadi karakter, M sepertinya pilihan yang logis.
Aaron Franke

27

Dari spesifikasi 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

Perhatikan bahwa Anda dapat menggunakan notasi huruf besar atau kecil.


19

M mengacu pada karakter non-ambigu pertama dalam "desimal". Jika Anda tidak menambahkannya, nomor tersebut akan dianggap ganda.

D ganda.


4
Saya kira ada beberapa alasan penting, tetapi itu membuat saya jengkel karena Anda mendapatkan kesalahan waktu kompilasi jika Anda membiarkannya keluar dari literal. Ini tidak seolah-olah ambigu.
SeaDrive

1
@ JSON Ia bekerja seperti itu untuk tipe integer, karena tidak ada ambiguitas di sana - selama cocok dengan tipe tersebut, ia tidak akan kehilangan / memutarbalikkan informasi apa pun. Hal yang sama tidak berlaku untuk angka desimal. Casting nilai ganda 0.42ke desimal dapat memberi Anda nilai yang berbeda dari 0.42M(dan sama untuk menggunakan literal ganda sebagai pengganti float literal - float val = 423.3juga gagal). Jadi Anda memilih antara perilaku yang salah dan kesalahan kompiler yang membutuhkan waktu setengah detik untuk memperbaikinya dan sesuai dengan standar CLR dan C #.
Luaan

1
"M", seperti dalam "deciMal"
Shadi Namrouti

2

Sebuah literal nyata yang di-sufiks oleh M atau m adalah tipe desimal. Sebagai contoh, literal 1m, 1.5m, 1e10m, dan 123.456M semuanya bertipe desimal. Literal ini dikonversi ke nilai desimal dengan mengambil nilai yang tepat, dan, jika perlu, pembulatan ke nilai representatif terdekat menggunakan pembulatan bankir. Skala apa pun yang tampak dalam literal dipertahankan kecuali nilainya dibulatkan atau nilainya nol (dalam hal ini tanda dan skala akan 0). Oleh karena itu, 2.900 m secara literal akan diuraikan untuk membentuk desimal dengan tanda 0, koefisien 2900, dan skala 3.

Baca lebih lanjut tentang literal sungguhan


0

Yah, kurasa M mewakili mantissa. Desimal dapat digunakan untuk menghemat uang, tetapi bukan berarti desimal hanya digunakan untuk uang.


Itu memang dugaan, dan itu jauh lebih masuk akal daripada hipotesis "karakter non-ambigu pertama yang tersedia". Jika Anda memiliki bukti pendukung, masukkan dalam jawaban Anda.
isherwood
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.