Реални типови

У програмском језику 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
Табела 1. Реални типови у програмском језику C#

У датој табели, 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. Ако је потребна конверзије међу другим реалним типовима, неопходно је користити каст операторе, тј. неопходно је извршити експлицитну конверзију.