을, 그것은 출력이 지속적으로 대답했습니다 만드는 방법의 문제 만은 왜 처음부터 다르게 그들이 출력 척도와 계수에 대해서. 10M
의 경우, 인코딩 된 값 (10)의 계수가 0의 규모 가지고
:
10.00M
의 경우
10M = 10 * 10^0
를 부호화 값 (1000)의 계수를 2의 비율을 가지고
10.00M = 1000 * 10^(-2)
당신은 종류의 메모리 값을 검사하여이 문제를 볼 수 있습니다
unsafe
{
fixed (decimal* array = new decimal[2])
{
array[0] = 10M;
array[1] = 10.00M;
byte* ptr = (byte*)array;
Console.Write("10M: ");
for (int i = 0; i < 16; i++)
Console.Write(ptr[i].ToString("X2") + " ");
Console.WriteLine("");
Console.Write("10.00M: ");
for (int i = 16; i < 32; i++)
Console.Write(ptr[i].ToString("X2") + " ");
}
}
출력
,
10M: 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00
10.00M: 00 00 02 00 00 00 00 00 E8 03 00 00 00 00 00 00
(0xa는 16 진수에서 10이며, 0x3E8 16 진수로 1000)이 문제는 C# 1 명세의 섹션 2.4.4.3에 약술되어
:
실제 문자 M 또는 접미사 m은 10 진수 형식입니다. 예를 들어, 리터럴 1m, 1.5m, 1e10m 및 123.456M은 모두 십진 형식입니다. 이 리터럴은 정확한 값을 취하여, 필요하다면 은행가의 반올림 (4.1.7)을 사용하여 가장 가까운 표현 가능한 값으로 반올림하여 10 진수 값으로 변환됩니다. 값이 반올림되지 않거나 값이 0 (리터럴에서 부호와 배율이 0이 아닌 경우) 인 경우를 제외하고는 리터럴에있는 모든 눈금이 보존됩니다. 따라서 문자 2.900m은 부호 0, 계수 2900 및 눈금 3이있는 소수로 구성됩니다.
예상되는 출력은 무엇입니까? 10, 10, 맞나요? –
글쎄, 나는 사실 10.00 10.00을 기대했지만, 적어도 10 10이면 numberFormat이 잘못되었다는 것이 분명 할 것이다. 이것은 단지 나를 혼란스럽게 만들었다. (실제 코드는 그리 간단하지 않기 때문에 소수점 이하 자릿수는 왜 숫자 형식이 좋았는지 알 수 있지만 시간이 좀 걸렸다.) – Damir
사이드 노트 : bool은 사용 가능한 ToString을 구현하므로 콘솔 .WriteLine (a == b);'는 예제에서와 같은 것을 출력 할 것입니다. –