11.8. حساب الفاصلة العائمة العشري #
توفر وحدة decimal نوع بيانات Decimal لحساب الفاصلة العائمة العشري. مقارنةً بتطبيق الفاصلة العائمة المدمج للثنائي، تُعدّ هذه الفئة مفيدةً بشكل خاص لكل من:
- التطبيقات المالية وغيرها من الاستخدامات التي تتطلب تمثيلًا دقيقًا للأعداد العشرية،
- والتحكم في الدقة،
- والتحكم في التقريب لتلبية المتطلبات القانونية أو التنظيمية،
- وتتبع المنازل العشرية المهمة،
أو التطبيقات التي يتوقع فيها المستخدم أن تتطابق النتائج مع الحسابات اليدوية.
على سبيل المثال، يُعطي حساب ضريبة بنسبة 5% على رسوم هاتف بقيمة 70 سنتًا نتائج مختلفة في الفاصلة العائمة العشرية والثنائية. يصبح الفرق كبيرًا إذا تم تقريب النتائج إلى أقرب سنت:
>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73
تحتفظ النتيجة العشرية بصفر متبقٍ، مما يستنتج تلقائيًا دلالة أربعة خانات من مضاعفات ذات دلالة خانتين. يُعيد النظام العشري إنتاج العمليات الحسابية كما لو كانت يدوية، ويتجنب المشاكل التي قد تنشأ عندما لا تستطيع قيمة الفاصلة العائمة الثنائية تمثيل الكميات العشرية بدقة.
يُمكّن التمثيل الدقيق فئة “العشري” من إجراء حسابات نمطية واختبارات مساواة غير مناسبة للأعداد العشرية الثنائية:
>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> sum([0.1]*10) == 1.0
False
توفر وحدة “العشري” دقة حسابية عالية حسب الحاجة:
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')