program tip

유형 접미사를 사용하지 않고 소수점이있는 숫자를 소수점 유형에 직접 할당 할 수없는 이유는 무엇입니까?

radiobox 2021. 1. 7. 07:49
반응형

유형 접미사를 사용하지 않고 소수점이있는 숫자를 소수점 유형에 직접 할당 할 수없는 이유는 무엇입니까?


유형 접미사를 사용하지 않고 소수점이있는 숫자를 소수점 유형에 직접 할당 할 수없는 이유는 무엇입니까? 이런 종류의 숫자는 소수 유형의 숫자로 간주되지 않습니까?

decimal bankBalance = 3433.20; // ERROR!

편집 : 질문의 마지막 부분을 놓쳤을 수 있으므로 아래 개요는 거의 유용하지 않습니다.

어쨌든, 당신이하려는 일을 할 수없는 이유는 부동 소수점 유형과 decimal. 그러나 int에서 decimal 로의 암시 적 변환이 있으므로 정수에서 할당 할 수 있습니다.


가능하지만이 구문을 사용해야합니다 (또는 명시 적으로 10 진수로 변환).

decimal bankBalance = 3433.20m;

그리고 수레의 경우

float bankBalance = 3433.20f;

기본값은 두 배입니다.

double bankBalance = 3444.20;

실제로 숨겨진 사양 기능 : 당신은 할 수 있습니다 ;-p

decimal bankBalance = (decimal)3433.20;

이것은 실제로 컴파일러에 의해 10 진수 (float 및 cast가 아님)로 구문 분석됩니다. 그것을 증명하기 위해 IL을 참조하십시오. 하지만 정밀도는 잘립니다 ( M버전 에서 얻은 2가 아닌 10 진수 1 개가 있음 ).

IL 생성 :

L_0001: ldc.i4 0x861c
L_0006: ldc.i4.0 
L_0007: ldc.i4.0 
L_0008: ldc.i4.0 
L_0009: ldc.i4.1 
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0 

비교 :

decimal bankBalance = 3433.20M;

다음을 생성합니다.

L_0001: ldc.i4 0x53d18
L_0006: ldc.i4.0 
L_0007: ldc.i4.0 
L_0008: ldc.i4.0 
L_0009: ldc.i4.2 
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0 

유일한 차이점은 소수 자릿수입니다 (1 대 2, 따라서 10의 요소)


decimal bankBalance = 3433.20M;

작동합니다. 그 이유는 float와 decimal이 매우 다른 유형이기 때문입니다. float는 입력 한 숫자와 매우 가까운 근사치를 제공하지만 decimal은 정확한 숫자를 제공합니다. 99 %의 경우 차이를 알아 차리지 못하며 float 만 사용해야합니다.


귀하의 답변은 두 가지 중요한 사항으로 구성됩니다.

  1. 소수점이있는 모든 숫자 리터럴 double은 C # 컴파일러에 의해 유형 인 것으로 추론되므로 기본적으로 3433.20a double입니다.

  2. double숫자 는 더 짧은 범위를 포함하는 것보다 정확 하기 decimal때문에 암시 적으로 변환되지 않으므로 double에서 decimal로 캐스트하는 동안 오버플로가 가능합니다.decimaldouble

double범위 : ±(~10^−324 to 10^308)유효 숫자 15 개 또는 16 개

decimal의 범위 : ±(~10^-28 to 10^28)28 개 또는 29 개의 유효 숫자.


일반적인 float 유형과 decimal간에 암시 적 변환이 없음을 설명하는 십진수 에 대한 MSDN 페이지를 참조하십시오 .

시험

decimal bankBalance = 3433.20m;

참조 URL : https://stackoverflow.com/questions/485185/why-cant-you-assign-a-number-with-a-decimal-point-to-decimal-type-directly-with

반응형