DECIMAL tipidagi sonlar bilan ishlash
Ko`pincha float tipidagi sonlar bilan ishlaganda, ularni ikkilik sanoq sistemasida ifodalash bilan bog’liq muammolar yuzaga kelib qoladi. Masalan, 4.5 soni bunday ifodalashdan keyin 4.4444444444444495 yoki 4.5000000000000012 shaklini olishi mumkin. Tabiiyki, bu hol ular ustida amal bajarish natijasida hatolik yanada ortib ketishi yoki taqqoslash natijalarining noto`g’ri bo`lishiga olib keladi. Bunday muammolarning oldini olish uchun Python dasturlash tilida decimal klassi nazarda tutilgan.
Decimal tipidagi sonlarni quyidagicha ko`rinishlardan birida yozish mumkin:
Decimal('12045') # butun sonlar
Decimal('1.23') # haqiqiy sonlar
Decimal('1.1e2'), Decimal('-1.1E2') # eksponentsial shaklda :
Decimal('NaN') # son emas
Decimal('Infinity'), Decimal('-Infinity') # cheksiz
Decimal('\uff19') # yunikodda
Bu klass metodlari haqiqiy sonlar ustida berilgan aniqlikdagi hisoblashlarni bajarishga imkon beradi.
from decimal import *
print((Decimal('3.3') + Decimal('4.4'))==7.7)
print((3.3+4.4)==7.7)
Shu sababli, ayniqsa bank amaliyoti bilan bog’liq ilovalarda float tipidagi sonlar bilan murakkab hisoblanadi. Qolaversa, haqiqiy sonlarning ishonchli raqamlarini ifodalashga zarurat paydo bo`lishi mumkin. Quyidagi namunaga e`tibor bering:
print(1.500 + 1.500)
print(Decimal('1.500') + Decimal('1.500'))
Shuni ta`kidlash joizki, float tipidagi sonlar fiksirlangan aniqlikka ega, Decimal tipidagi sonlar uchun aniqlikni o`rnatish imkoniyati mavjud:
print('float : ',7**0.5)
getcontext().prec = 50
print('decimal : ', Decimal(7).sqrt())
Bundan tashqari, decimal moduli shunchaki raqamlar sonini belgilash emas, balki o`rnatilgan muvozanat buziladigan holatlarni ham tutib qolishga imkon beradi va uchta tushunchaga asoslanadi: o`nli son, hisoblashlar konteksti va signallar.
Decimal modulida o`nli sonlar ma`lumotlarning o`zgarmas tipiga mansub bo`ladi, ya`ni ularni to`g’ridan‑to`g’ri o`zgartirib bo`lmaydi. Bu sonlar ishoraga, mantissa va eksponenta ega bo`lishi mumkin. Oxirida turgan nollar tashlab yuborilmaydi, −0 va +0 sonlar bir‑biridan farqli hisoblanadi.
Hisoblash konteksti o`z ichiga aniqlik, yahlitlash qoidalari, eksponentaga chegaralar, amal natijalari uchun bayroqlar va istisnoli vaziyatlarni faollashtirish vositalarini oladi.
Signallar – bu hisoblash jarayonida yuzaga kelishi mumkin mahsus vaziyatlardan iborat istisnoli yoki axborot beruvchi xarakteriga ega bo`ladi, zarur hollarda inkor qilinishi mumkin. Har bir signal uchun alohida bayroq hamda tutib qolish aktivatori mavjud. Agar aktivatorda 1 ko`rsatilgan bo`lsa, istisnoli vaziyatga murojaat qilinadi.
Modulni faollashtirish uchun quyidagi ko`rsatmadan foydalaniladi:
from decimal import *
Bu modulda joriy kontekstni ko`rish uchun getcontext() metodidan foydalanish mumkin:
>>> getcontext()
Bu yerda prec parametri o`nli son raqamlari sonini ko`rsatadi. Bu miqdor to`g’ridan‑to`g’ri 28 ga teng. Zarur hollarda bu miqdorni o`zgartirish mumkin. Masalan: getcontext().prec = 22. SHundan so`ng, o`nli sonlar 22 ta raqam orqali ifodalanadi.
Agar float tipidagi sonlarni Decimal ga o`zgartirishga to`g’ri kelganda, bu son ikkilik sanoq sistemasiga o`tkaziladi va bu natija qiymat sifatida qabul qilinadi. Float tipidagi sonlarni Decimal dagi ko`rinishidagi so`nggi raqamlar ana shu holatga ishora qiladi. Prec ning qiymati ishonchli raqamlar sonini o`zgartirmaydi, ammo arifmetik amallar bajarilganidan so`ng, bu son albatta hisobga olinadi:
getcontext().prec = 5
print('Decimal :', Decimal('1.350000'))
x=Decimal(1.350000)
print('float dan Decimal ga: ', x)
Do'stlaringiz bilan baham: |