ফ্লোটিং পয়েন্ট নম্বর মেমরিতে বেস ২ বাইনারি ফ্র্যাকশন হিসেবে রিপ্রেজেন্ট করা হয়। ফলস্বরূপ ফ্লোটিং পয়েন্ট অর্থমেটিক অপারেশন সময়ে সময়ে অদ্ভুত ফলাফল দিতে পারে। ০.১ এবং ০.২-এর যোগফল اذাইটিং ফলাফল দিতে পারে:
>>> 0.1 + 0.2 0.30000000000000004
বস্তুতঃ এটি বাইনারি ফ্লোটিং পয়েন্ট রিপ্রেজেন্টেশনের প্রকৃতি। এটি যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজে প্রচলিত। পাইথন একটি decimal মডিউল প্রদান করে দ্রুত এবং সঠিকভাবে রাউন্ডেড ফ্লোটিং-পয়েন্ট অর্থমেটিক সম্পাদনের জন্য।
decimal মডিউল ফ্লোটিং পয়েন্টকে ঠিক যেমন কেউ চায় সেজন্য রিপ্রেজেন্ট করার জন্য ডিজাইন করা হয়েছে, এবং অর্থমেটিক অপারেশনের ফলাফল এক্সপেক্টেশনের সাথে কনসিস্টেন্ট। রিপ্রেজেন্টেশন এবং অপারেশনের প্রিসিশন লেভেল ২৮টি দশমিক স্থান পর্যন্ত সেট করা যায়।
decimal মডিউল Decimal ক্লাস সংজ্ঞায়িত করে। Decimal অবজেক্ট এর কনস্ট্রাক্টরে একটি ইন্টিজার, নিউমেরিক রিপ্রেজেন্টেশন সহ একটি স্ট্রিং, বা একটি টাপল প্যারামিটার হিসেবে দিয়ে ডিক্লেয়ার করা যায়।
>>> from decimal import Decimal
>>> d1 = Decimal(10)
>>> d1
Decimal('10')
>>> d2 = Decimal('10')
>>> d2
Decimal('10')
একটি টাপল প্যারামিটার তিনটি এলিমেন্ট ধারণ করে, সাইন (পজিটিভের জন্য ০, নেগেটিভের জন্য ১), একটি ডিজিটের টাপল, এবং এক্সপোনেন্ট। উদাহরণস্বরূপ:
>>> d3 = Decimal((1, (1, 2, 3, 4), 2))
>>> d3
Decimal('-1.234E+5')
একটি নির্দিষ্ট প্রিসিশনের ফ্লোটিং পয়েন্ট নম্বর রিপ্রেজেন্ট করার একটি আরও সুবিধাজনক উপায় হলো getcontext() ফাংশন ব্যবহার করে বর্তমান থ্রেডের কন্টেক্সট এনভায়রনমেন্ট পাওয়া এবং Decimal অবজেক্টের জন্য প্রিসিশন সেট করা।
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 5
>>> d3 = Decimal(10)
>>> d4 = Decimal(3)
>>> d3 / d4
Decimal('3.3333')
কন্টেক্সট হলো অর্থমেটিক অপারেশনের জন্য এনভায়রনমেন্ট যা প্রিসিশন নির্ধারণ করে এবং রাউন্ডিং নিয়ম সংজ্ঞায়িত করে serta এক্সপোনেন্টের রেঞ্জ লিমিট করে।
- decimal.getcontext() − সক্রিয় থ্রেডের জন্য বর্তমান কন্টেক্সট রিটার্ন করে।
- decimal.setcontext(c) − সক্রিয় থ্রেডের জন্য বর্তমান কন্টেক্সট c-তে সেট করে।
decimal মডিউলে নিচের রাউন্ডিং মোড কনস্ট্যান্ট সংজ্ঞায়িত:
| ROUND_CEILING | অনন্ততার দিকে রাউন্ড করুন। |
| ROUND_DOWN | শূন্যের দিকে রাউন্ড করুন। |
| ROUND_FLOOR | ঋণাত্মক অনন্ততার দিকে রাউন্ড করুন। |
| ROUND_HALF_DOWN | নিকটতমে রাউন্ড করুন, টাই হলে শূন্যের দিকে। |
| ROUND_HALF_EVEN | নিকটতমে রাউন্ড করুন, টাই হলে নিকটতম সম সংখ্যার দিকে। |
| ROUND_HALF_UP | নিকটতমে রাউন্ড করুন, টাই হলে শূন্য থেকে দূরত্বে। |
| ROUND_UP | শূন্য থেকে দূরত্বে রাউন্ড করুন। |
| ROUND_05UP | শূন্য থেকে দূরত্বে রাউন্ড করুন যদি রাউন্ড করার পর শেষ ডিজিট ০ বা ৫ হত; অন্যথায় শূন্যের দিকে রাউন্ড করুন। |
নিচের কোড স্নিপেট কন্টেক্সট অবজেক্টের precision এবং rounding প্যারামিটার ব্যবহার করে:
>>> from decimal import *
>>> getcontext().prec = 5
>>> getcontext().rounding = ROUND_UP
>>> d1 = Decimal(100)
>>> d2 = Decimal(6)
>>> d1 / d2
Decimal('16.667')
Decimal অবজেক্টের ওপর অর্থমেটিক অপারেশন
Decimal অবজেক্টের ওপর সকল সাধারণ অর্থমেটিক অপারেশন করা যায়, সাধারণ ফ্লোটের মতো।
>>> a = Decimal('2.4')
>>> b = Decimal('1.2')
>>> a + b
Decimal('3.6')
>>> a - b
Decimal('1.2')
>>> b - a
Decimal('-1.2')
>>> a * b
Decimal('2.88')
>>> a / b
Decimal('2')
অর্থমেটিক অপারেশন এক Decimal অপারেন্ড এবং এক ইন্টিজার অপারেন্ডের ওপর করা যায়। তবে সাধারণ ফ্লোটিং পয়েন্ট অবজেক্টের সাথে অপারেশন ইনভ্যালিড।
>>> a = Decimal('2.4')
>>> c = 2.1
>>> a + c
Traceback (most recent call last):
File "", line 1, in
a + c
TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
সকল অর্থমেটিক অপারেশনের জন্য একই এক্সসেপশন ঘটে।
Decimal অবজেক্টের সাথে রিমেইন্ডার (%) অপারেটরের আচরণ সাধারণ নিউমেরিক টাইপ থেকে কিছুটা ভিন্ন। এখানে, ফলাফলের সাইন হলো ডিভিডেন্ডের সাইন, ডিভাইজারের সাইন নয়।
>>> -7 % 3
2
>>> 7 % -3
-2
>>> Decimal(-7) % Decimal(3)
Decimal('-1')
>>> Decimal(7) % Decimal(-3)
Decimal('1')
Decimal.from_float()
এই ফাংশন সাধারণ ফ্লোটকে Decimal অবজেক্টে রূপান্তর করে সঠিক বাইনারি রিপ্রেজেন্টেশনের সাথে। ফলস্বরূপ from_float(0.1) এবং Decimal('0.1') একই নয়।
>>> d1 = Decimal('0.1')
>>> d2 = Decimal.from_float(0.1)
>>> d1, d2
(Decimal('0.1'), Decimal('0.1000000000000000055511151231257827021181583404541015625'))
এই আর্টিকেল পাইথন স্ট্যান্ডার্ড লাইব্রেরির decimal মডিউলে সংজ্ঞায়িত ফাংশনালিটি ব্যাখ্যা করে।