Co oznacza skrót M w notacji dziesiętnej w języku C #?


311

Aby pracować z dziesiętnymi typami danych, muszę to zrobić ze zmienną inicjalizacją:

decimal aValue = 50.0M;

Co oznacza część M?

Odpowiedzi:


386

Oznacza to, że jest to dziesiętny, jak powiedzieli inni. Jednak początki prawdopodobnie nie są te sugerowane gdzie indziej w tej odpowiedzi. Ze standardu z adnotacjami w języku C # (wersja ECMA, a nie wersja MS):

decimalPrzyrostek M / m od D / d już podjąć double. Chociaż sugerowano, że M oznacza pieniądze, Peter Golde przypomina, że ​​M został wybrany po prostu jako następny najlepszy list w decimal.

Podobny Adnotacja wspomina się, że wczesne wersje C # zawiera „T” i „S”, bytei shortliterałami odpowiednio. Zostały porzucone z tego powodu, że nie były bardzo użyteczne.


6
To pozostawia pytanie, dlaczego E / e nie był kolejnym najlepszym listem.
VVS

61
„e” byłoby problematyczne, ponieważ jest już używane w literałach. Na przykład „2e4m” jest prawidłowym literałem (dziesiętnie 20000). Nawet jeśli byłby jednoznaczny (i może tak być, chociaż „1e” kończy się ciekawym komunikatem o błędzie kompilatora sugerującym, że jest poza zakresem wykonalnych podwójnych, nie oznacza to, że jest nieprawidłowy składniowo; podejrzewam, że to błąd), nadal byłby mylące. „c” prawdopodobnie miałoby sens bez powodowania zamieszania, chociaż bez wątpienia sugerowałoby ludziom „walutę” :)
Jon Skeet

7
„c” powoduje konflikt z literałem znaku dla ciągów w VB.Net, choć nawet tam gramatyka jest nieco inna.
Joel Coehoorn,

3
Nie miałbym większego problemu z tym, że różni się w C # i VB. VB ma już inną składnię szesnastkową, na przykład IIRC.
Jon Skeet

9
Jeśli ułożysz sylaby „Dziesiętne”, otrzymasz „De Ci Mal”. Są to najbardziej sensowne w użyciu. D jest już zajęte, C może być znakami, M wydaje się logicznym wyborem.
Aaron Franke

27

Ze specyfikacji 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

Pamiętaj, że możesz użyć wielkiej lub małej litery.


19

M odnosi się do pierwszego niejednoznacznego znaku „dziesiętnego”. Jeśli go nie dodasz, liczba zostanie potraktowana jako podwójna.

D jest podwójny.


4
Przypuszczam, że istnieje jakiś ważny powód, ale denerwuje mnie to, że pojawia się błąd czasu kompilacji, jeśli pominiesz literę dosłownie. To nie jest tak, że jest dwuznaczne.
SeaDrive,

1
@JSON Działa w ten sposób dla typów całkowitych, ponieważ nie ma w tym dwuznaczności - dopóki pasuje do typu, nie straci / nie zmieni żadnych informacji. To samo nie dotyczy liczb dziesiętnych. Rzutowanie podwójnej wartości 0.42na dziesiętną może dać inną wartość niż 0.42M(i to samo w przypadku używania podwójnego literału zamiast literału zmiennoprzecinkowego - float val = 423.3również się nie powiedzie). Więc wybierasz między subtelnie złym zachowaniem a błędem kompilatora, którego naprawienie zajmuje pół sekundy i jest zgodne ze standardami CLR i C #.
Luaan,

1
„M”, jak w „deciMal”
Shadi Namrouti

2

Prawdziwy literał z przyrostkiem M lub m jest typu dziesiętnego. Na przykład literały 1 m, 1,5 m, 1 e 10 m i 123,456 M są dziesiętne. Literał ten jest konwertowany na wartość dziesiętną poprzez pobranie dokładnej wartości i, jeśli to konieczne, zaokrąglenie do najbliższej możliwej do reprezentacji wartości za pomocą zaokrąglenia bankierskiego. Każda skala widoczna w literale jest zachowywana, chyba że wartość jest zaokrąglona lub wartość wynosi zero (w którym to przypadku znak i skala będą wynosić 0). Stąd dosłowne 2,900 m zostanie sparsowane do postaci dziesiętnej ze znakiem 0, współczynnikiem 2900 i skalą 3.

Przeczytaj więcej o prawdziwych literałach


0

Cóż, myślę, że M reprezentuje mantysę. Dziesiętna może być używana do oszczędzania pieniędzy, ale to nie znaczy, dziesiętna używana tylko do pieniędzy.


To jest rzeczywiście przypuszczenie i jest znacznie mniej prawdopodobne niż hipoteza „pierwszego dostępnego niejednoznacznego charakteru”. Jeśli masz dowody potwierdzające, dołącz je do swojej odpowiedzi.
isherwood
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.