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 > Decimal の範囲 ?

4

2 に答える 2

4

精度だけではないからです。範囲についても考える必要があります-率直に言って、実際には非常に1.79769313486232e308大きいです(小数点以下300桁以上)。あなたの主張「小数の偶数範囲> floatまたはdouble」は正しくありません。

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

a の範囲が adoubleの範囲より大きいdecimal

double.NaNまた、 、double.PositiveInfinityおよびを考慮する必要がある場合がありますdouble.NegativeInfinity

于 2012-06-28T10:11:40.640 に答える
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
于 2012-06-28T10:14:44.133 に答える