2012-06-28 2 views
0
int i = 1;  // -2,147,483,648 to 2,147,483,647 
float f = 2.1f;  // -3.402823e38 to 3.402823e38 
long l = 3;  // -922337203685477508 to 922337203685477507 
double dbl = 4.5; // -1.79769313486232e308 to 1.79769313486232e308 
decimal dec = 5.2m; // -79228162514264337593543950335 to 79228162514264337593543950335 

dec = i;  // No error 
dec = l;  // No error 

dec = f; // Compiler error 
dec = dbl; // Compiler error 

f = (float)dec; // No error (May loss precision) ok 

**dec = (decimal)dbl;** // No error why it requires ? 

왜 위 코드에 명시 적 캐스트가 필요한지? float/Double의 범위> 10 진수?C에서 소수점 이하로 변환

답변

4

정밀도 만이 아니기 때문에. 범위도이라고 생각해야합니다. - 솔직히 1.79769313486232e308이고, 실제로는입니다 (소수점 왼쪽에서 300 자 이상). 당신의 단언 "소수점 이하> float 또는 double"의 올바르지 않습니다.

var dbl = double.MaxValue; 
var dec = (decimal) dbl; // BOOM! 

double의 범위는 decimal 범위보다크다.

또한 double.NaN, double.PositiveInfinitydouble.NegativeInfinity을 고려해야 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 float에 대한 이야기도 마찬가지입니까? –

+1

@MSK'float'은 여전히 ​​x10^38 (e38이 의미하는) 범위를 가지므로 YES입니다. 또한, 'foat.NaN','float.PositiveInfinity','float.NegativeInfinity' ... 비교를 위해 소수점의 범위는 e28 –

+0

decimal dec = decimal.MaxValue; float flt = (float) dec; // OK. 나는 다운 캐스팅을 할 때 명시적인 변환이 필요하다고 가정합니다. 십진수의 범위

0

변환은 데이터 유형의 범위가 아닌 데이터 유형의 크기에 달려 있다고 생각합니다.

Integral Types 

DataType Size . Net (CTS) Comments 
byte 1 System.Byte 0 - 255 It is Unsigned 
sbyte 1 System.SByte -128 to 127 - Signed 
short 2 System.Int16  
ushort 2 System.UInt16 
int  4 System.Int32  
uint 4 System.Unt32  
long 8 System.Int64  
ulong 8 System.UInt64 

Floating Types 
decimal 16 System.Decimal Has up to 28 digits after decimal 
float 4 System.Single Has up to 8 digits after decimal 
double 8 System.Double Has up to 15 digits after decimal 
+0

크기에 따라 다르면 암시 적 캐스트를 허용하는 이유는 무엇입니까? –

관련 문제