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: |