ТЕМА 4: РЕАЛЕН ТИП ДАННИ
1. Реални типове данни
а) реални типове с плаваща запетая
Реалните типове в C# представляват реалните числа, които познаваме от математиката. Те се представят чрез плаваща запетая (floating-point) и са float и double.
Разгледаните реални типове в C# float и double се различават освен с порядъка на възможните стойности, които могат да заемат, и по точност (броят десетични цифри, които запазват). Първият тип има точност 7 знака, вторият – 15-16 знака.
float |
0.0f |
±1.5×10-45 |
±3.4×1038 |
double |
0.0d |
±5.0×10-324 |
±1.7×10308 |
б) реални типове с десетична точност
В C# се поддържа т. нар. десетична аритметика с плаваща запетая (decimal floating-point arithmetic), при която числата се представят в десетична, а не в двоична бройна система и така не се губи точност при записване на десетично число в съответния тип с плаваща запетая.
Типът данни за реални числа с десетична точност в C# е 128-битовият тип decimal. Той има точност от 28 до 29 десетични знака.
decimal |
0.0m |
±1.0×10-28 |
±7.9×1028 |
Пресмятанията извършвани над числа с плаваща „.” са свързани с нееднократни закръгляния на стойности, което води до неточни резултати. Типът decimal премахва тези грешки, тази възможност за представяне на десетични стойности без грешки е полезна при финансови разчети.
Пример за пресмятане на баланс след начисляване на лихва.
Пример 1:
decimal balance, rate;
balance=1000.10m;
rate = 0.1m;
balance*=rate;
Ще отбележим, че след десетичните const от тип decimal трябва да следва суфикс „M” или „m”, иначе ще се интерпретират като константи с плаваща точка и няма да са съвместими с decimal.
decimal е уникален в C#, такъв тип данни няма в C/C++.
2. Примери и задачи
Пример 2:
float floatPI = 3.141592653589793238f;
double doublePI = 3.141592653589793238;
// Float PI is: 3.141593
// Double PI is: 3.14159265358979
Пример 3:
Да се изчертаят 4 командни бутона и 3 етикета.
При кликване върху button1, в label1 да се изведе дали в типа float сумата на десет числа със стойност 0.1 е 1.0.
При кликване върху button2, в label2 да се изведе дали в типа double сумата на десет числа със стойност 0.1 е 1.0.
При кликване върху button3, в label3 да се изведе дали в типа decimal сумата на десет числа със стойност 0.1 е 1.0.
При кликване върху button4, да се излезе от приложението.
Да се поставят подходящи надписи върху командните бутони.
private void button1_Click(object sender, EventArgs e)
{
float sum=0.0f;
sum=0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f;
float sum1 = 1.0f;
bool equal = (sum == sum1);
label1.Text = Convert.ToString(equal);
}
private void button2_Click(object sender, EventArgs e)
{
double sum=0.0;
sum = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
double sum1 = 1.0;
bool equal = (sum == sum1);
label2.Text = Convert.ToString(equal);
}
private void button3_Click(object sender, EventArgs e)
{
decimal sum = 0.0M;
sum = 0.1M + 0.1M+0.1M + 0.1M+0.1M + 0.1M+0.1M + 0.1M+0.1M + 0.1M;
decimal sum1 = 1.0M;
bool equal = (sum == sum1);
label3.Text = Convert.ToString(equal);
}
private void button4_Click(object sender, EventArgs e)
{
Environment.Exit(0);
}
Пример 4:
Най-често се използва тип double, една от причините е че много математически функции от .NET Framework ползват стойности от тип double – примерно sqrt() определен в System.Math;
Пресмятане на хипотенуза с sqrt:
private void button1_Click(object sender, EventArgs e)
{
double x, y, z;
x = 3;
y = 4;
z = Math.Sqrt(x * x + y * y);
label1.Text="Дължината на хипотенузата е равна на: " + z;
}
Тук името на методът sqrt е отделено с „.” от името на класа Math.
Задача 1:
Като се използва методa PI от класа Math да се пресметне лице и периметър на окръжност. ( S=Math.PI * r * r; P=2*Math.PI*r; )