C#. Kasr sonlarni ifodalovchi malumot turlari
Tags: csharp, realnumbers, typesincsharp, kasrsonlar
Published: 2024-04-18 17:39:54

C# dasturlash tilida **davomiy** yaniy **kasr sonlarni** ifodalash(saqlash, yoki ular ustida turihil arifmetik operatsiyalar amalga oshirish) uchun 3 hil malumot turlari mavjud. Bular: **_float_**, **_double_** va **_decimal_** tiplaridir.

**FLOAT** - hajmi 4byte(32-bitli) suzuvchi nuqtali raqamlarni ifodalovchi tip, taxminan 6~7 ta aniqlikgacha raqamlarni saqlay oladi, floatning taxminiy diapazoni ~ ±1.5 x 10^−45 dan ±3.4 x 10^38 gacha, bu taxminan 3.4028235E+38 ~ -3.4028235E+38.
float tipni elon qilish: **`float PI = 3.14159f;`**

**Double** - hajmi 8byte(64-bitli) suzuvchi nuqtli raqam turi bo'lib, taxminan 15~16 raqamli aniqlikni ta'minlaydi, doublening taxminiy diapazoni ~ ±5.0 × 10^−324 dan ±1.7 × 10^308 gacha, taxminan 1.7976931348623157E+308 ~ -1.7976931348623157E+308 dir.
double tipni elon qilish: **`double PI = 3.14159d;`**

**Decimal** - hajmi 16byte(128-bitli) suzuvchi nuqtali raqamlarni ifodalovchi malumot turi, taxminan 28~29 raqamli aniqlikni ta'minlaydi, bu turni taxminiy diapazoni ±1.0 x 10^-28 dan ±7.9228 x 10^28 gacha, bu esa 79228162514264337593543950335 ~ -79228162514264337593543950335 dir
decimal tipini elon qilish: **`decimal PI = 2.14159m;`**. 

Bu malumot turlarini ishlatish holatlari:
> **float** va **double** asosan turli hil arifmetik, fizik, kimyoviy yoki tabiat hodisalarini hisoblovchi operatsiyalar(harorat, tezlik va shunga o'xshash)da keng ishlatilinadi. 
**decimal** esa asosan iqtisodiy hisob-kitob(Valyuta konvertatsiyasi, soliq va foizlarni hisoblash) paytida ishlatilinadi, chunki bu operatsiyalrda yuqori aniqlik talab qilinadi.

Ularning kamchilik va ustun taraflari:
>**float** ustunligi:
1. Xotira samaradorligi: double va decimal turlariga qaraganda kamroq xotirani egallaydi, bu suzuvchi nuqtali raqamlarning katta massivlari bilan ishlashda foydali bo'lishi mumkin.
2. Tezligi: Float bilan bog'liq operatsiyalar, ayniqsa, bitta aniqlik arifmetikasi optimallashtirilgan platformalarda, double yoki decimal qaraganda tezroq bo'lishi mumkin.   
                    
>Kamchiliklari:
1. Cheklangan aniqlik: float taxminan 7 ta aniqlikni ta'minlaydi, bu yuqori aniqlikdagi hisob-kitoblarni talab qiladigan ilovalar uchun etarli bo'lmasligi mumkin.
2. Cheklangan diapazon: Ikkilik va oʻnlik bilan solishtirganda koʻrsatilishi mumkin boʻlgan qiymatlarning cheklangan diapazoniga ega, bu esa maʼlum paytda toʻlib ketish(overflow) xatolariga olib kelishi mumkin.

> **double** ustunligi:
1. Yuqori aniqlik: floatga nisbatan ikki barobar aniqlik ni(taxminan 15-16 raqamni) ta'minlaydi, bu esa uni ko'proq aniqlik talab etuvchi dasturlar uchun mos keladi.
2. Kengroq diapazon: float bilan solishtirganda ko'rsatilishi mumkin bo'lgan sonlarni ancha kengroq diapazonga ega bo'lib, to'lib ketish(overflow) xatolari ehtimolini kamaytiradi.

> Kamchiliklari:
1. Xotiradan foydalanish: float bilan solishtirganda ko'proq xotira sarflaydi, bu xotira samaradorligi juda muhim bo'lganida muammo tug'dirishi mumkin, garchi bu ko'p ilovalarda ahamiyatsiz bo'lishi mumkin.
2. Yaxlitlash xatolari uchun potentsial: Double o'zining yuqori aniqligiga qaramay, juda kichik hisoblarda yaxlitlash xatolariga moil bo'lishi mumkin.                          
 
```                                            
float floatSon = .3f + .3f + .3f + .1f;        
double doubleSon = .3 + .3 + .3 + .1;       <-- muamo
decimal decimalSon = .3m + .3m + .3m + .1m;

Console.WriteLine($"{floatSon:f33}");
Console.WriteLine($"{doubleSon:f33}");
Console.WriteLine($"{decimalSon:f33}");

result: 
_float_  : 1.000000000000000000000000000000000
_double_ : 0.999999999999999888977697537484346 <-- muamo
_double_ : 1.000000000000000000000000000000000
```

> **decimal** ustunligi:
1. Yuqori aniqlik: kasr qismining aniqligi taxminan 28-29 ta sondan iborat, bu uni moliyaviy hisoblarda yaniy yuqorida aytilganidek juda aniq hisob-kitob talab qiladigan ilovalar uchun mos keladi.
2. Yaxlitlash xatolarining kamayishi: Yuqori aniqligi tufayli double va floatga nisbatan yaxlitlash xatolariga kamroq moyil.

> Kamchiliklari:
1. Xotiradan foydalanish: float va double bilan solishtirganda ko'proq xotirani iste'mol qiladi, chunki u 128 bitli ma'lumotlar turi bo'lib, xotira samaradorligi juda muhim bo'lganida tashvish tug'dirishi mumkin.
2. Tezlik(performance): Xotiradan ko'proq joy eganlashi sabab tez ishlashi muhim bo'lgan dasturlarda bu muammo keltirib chiqarishi mumkin.

Qo'shimcha malumot:
>Yuqoridagi kodlarda etiborni tortuvchi narsa bu `f`, `d`(bu qoshimchani ishlatmasaham bo'ladi) yoki `m` qoshimchalaridir(suffikslar). Bu qo'shimchalar hechqanday hatolik(error) keltirib chiqarmaydi, aksincha bu qo'shimchalarni ishlatmaslik, compiletime errorlaga olib keladi. Suffikslarni ishlatishdan maqsad, undan oldin keluvchi kasr sonlar qaysi malumot turiga mansubligini bildirib turivchi ishoralardir. Yaniy (by default)boshidan harqanday kasr son yaratilganida hech qanday suffikslar qoshilmasa, bu sonlar **double** turiga tegishli bo'lib qoladi, boshqa turdagi malumotga o'girish uchun shu qo'shimchalarni ishlatish zarur. Shunday qilib **float** turdagi kasr sonini yaratish uchun `f` suffiksi, **double** tipi uchu esa `d`(hardoimham shart emas!!!) va **decimal** turidagi kasr soni yaratish uchun esa `m` qo'shimchalarini ishlatish zarur. **_m_** suffiksi **_money_** sozidan olingan.
P.S **decimal** ni iqtisod(pul) bilan uzviy bog'liq dasturlarda ishlatilishi shart.


 Bu postim sizlarga ozgina bolsada biron foyda keltiradi deb umid qilaman. Etiboringiz uchun katta rahmat, kelgusida ko'rishguncha🙂