Подсетимо се реалних типова у програмском језику C које смо користили у I и II разреду. За представљање реалних бројева, тзв. бројева са покретном тачком (floating-point), користили смо float
(обична прецизност, 4 бајта), double
(двострука прецизност, 8 баја) и long double
(вишеструка прецизност, 10 бајта или више).
У програмском језику C# и .NET окружењу дефинисана је слична палета реалних типова података.
C# тип | Опсег | Прецизност | Величина | .NET тип |
---|---|---|---|---|
float | од ±1.5 x 10−45 до ±3.4 x 1038 | ~6-9 цифара | 4 бајта | System.Single |
double | од ±5.0 × 10−324 до ±1.7 × 10308 | ~15-17 цифара | 8 бајта | System.Double |
decimal | од ±1.0 x 10-28 до ±7.9228 x 1028 | ~28-29 цифара | 16 бајта | System.Decimal |
У датој табели, C# типови из прве колоне представљају алијасе (псеудониме) .NET типова у четвртој колони. То значи да приликом декларације променљивих можемо равноправно користити и C# и .NET типове. На пример:
double a = 12.3;
System.Double b = 12.3;
У лекцијама које следе користићемо C# типове и то најчешће тип double
.
Подразумевана вредност сваког реалног типа је нула, 0
. За сваки реални тип дефинисане су константе MinValue
и MaxValue
којима су одређене најниже и највише вредности типа. Поред тога, за типове float и double дефинисане су посебне константе за случајеве није-број (Single.NaN
и Double.NaN
) и бесконачан-број (Single.NegativeInfinity
, Single.PositiveInfinity
и Double.NegativeInfinity
, Double.PositiveInfinity
). Ове константе могу се користити приликом дељења нуле са нулом (недефинисан резултат) и приликом дељења са нулом (негативна или позитивна бесконачност). Да би се одредило да ли нека вредност није број, користи се метода IsNaN
. Тип decimal
обично се користи у финансијским калкулацијама јер има највећу прецизност и најмањи опсег.
Литерали
Литерали реалног типа одређује се на основу суфикса на следећи начин:
- Литерал без суфикса или са суфиксом
d
илиD
је типаdouble
. - Литерал са
f
илиF
суфиксом је типаfloat
. - Литерал са
m
илиM
суфиксом је типаdecimal
.
На пример:
var d = 1.0; // double
d = 1.41d; // double
d = 1.73D; // double
var f = 1.41f; // float
f = 1.73F; // float
var m = 1.41m; // decimal
m = 1.73M; // decimal
или:
double d = 1.0;
d = 1.41d;
d = 1.73D;
float f = 1.41f;
f = 1.73F;
decimal m = 1.41m;
m = 1.73M;
За веома мале и веома велике бројеве обично се користи експоненцијална нотација (научна нотација, scientific notation) облика mEs или mes, где је m мантиса, а s експонент. Мантиса је децимални број који може да има предзнак, целобројни део, децималну тачку и разломљени део. Експонент је увек цео број који може да има предзнак. На пример:
double d = 3.14159E+00; // 3.14159
float f = -7.3E-04f; // -0.00073
decimal m = 1.5E6m; // 1500000
Конверзије
Ако се у истом изразу користе операнди целобројних типова и реалних типова double
и/или float
, операнди целобројних ће се имплицитно конвертовати у реалне, и ако је неопходно операнди типа float
ће се имплицитно конвертовати у тип double
. Вредност оваквог израза одређује се на следећи начин:
- Ако се у изразу налази тип
double
, вредност израза биће типаdouble
, илиbool
ако је израз релациони или израз поређења једнакости. - Ако се у изразу не налази тип
double
, вредност израза биће типаfloat
, илиbool
ако је израз релациони или израз поређења једнакости.
Ако се у истом изразу користе операнди целобројних типова и операнди реалног типа decimal
, вредност израза биће типа decimal
, или bool
ако је израз релациони или израз поређења једнакости. У истом изразу не смеју се мешати операнди типова double
и float
са операндима типа decimal
.
Значи, међу реалним типовима постоји само једна врста имплицитне конверзије: из типа float
у тип double
. Ако је потребна конверзије међу другим реалним типовима, неопходно је користити каст операторе, тј. неопходно је извршити експлицитну конверзију.