ال

الكسور في Python

{zero: "لا توجد تمارين", one: "1 تمرين", two: "تمرينان", few: "%{count} تمارين", many: "%{count} تمرينًا", other: "%{count} تمرين"}

نبذة عن الكسور

تتيح لنا وحدة fractions إنشاء rational numbers والتعامل معها: كسور ببسط صحيح مقسوم على مقام صحيح.

على سبيل المثال، يمكننا تخزين 2/3 ككسر دقيق بدلًا من قيمة float التقريبية 0.6666...

إنشاء الكسور

على عكس الأعداد int و float و complex، لا تملك الكسور صيغة حرفية. مع ذلك، فإن باني Fraction مرن جدًا.

أبسط ما في الأمر أنه يمكنه أخذ عددين صحيحين. تُزال العوامل المشتركة تلقائيًا، محوّلًا الكسر إلى «أبسط صورة» له (أصغر الأعداد الصحيحة التي تمثل الكسر بدقة):

>>> from fractions import Fraction

>>> f1 = Fraction(2, 3) # 2/3
>>> f1
Fraction(2, 3)

>>> f2 = Fraction(6, 9)
>>> f2
Fraction(2, 3)  # automatically simplified

>>> f1 == f2
True

يمكن لباني Fraction أيضًا تحليل سلسلة نصية:

>>> f3 = Fraction('2/3')
>>> f3
Fraction(2, 3)

يمكنه أيضًا العمل مع معاملات float، لكن هذا قد يواجه مشكلات بسبب الطبيعة التقريبية لتمثيل القيمة العشرية داخليًا بالنظام الثنائي. لمزيد من المعلومات حول مشكلة التمثيل هذه، راجع موقع 0.30000000000000004، وحساب الفاصلة العائمة: المشكلات والقيود في وثائق Python.

للحصول على نتيجة أكثر موثوقية عند استخدام الأعداد العشرية مع الكسور، توجد طريقة <fraction>.limit_denominator().

.limit_denominator() يمكنها أخذ معامل صحيح إذا كانت لديك متطلبات محددة، لكن حتى القيمة الافتراضية (max_denominator=1000000) يمكنها أن تعمل جيدًا وتعطي تقريبًا بسيطًا ومقبولًا.

>>> Fraction(1.2)
Fraction(5404319552844595, 4503599627370496)

>>> Fraction(1.2).limit_denominator()
Fraction(6, 5)

العمليات الحسابية على الكسور

تعمل arithmetic operators المعتادة + - * / ** مع الكسور، كما هو الحال مع الأنواع العددية الأخرى.

يمكن تضمين الأعداد الصحيحة والكسور الأخرى من النوع Fraction، فتعطي نتيجة من النوع Fraction. إدراج float في التعبير يؤدي إلى نتيجة من النوع float، مع فقدان محتمل للدقة.

>>> Fraction(2, 3) + Fraction(1, 4) # addition
Fraction(11, 12)

>>> Fraction(2, 3) * Fraction(6, 5) # multiply fractions
Fraction(4, 5)

>>> Fraction(2, 3) * 6 / 5 # fraction with integers
Fraction(4, 5)

>>> Fraction(2, 3) * 1.2  # fraction with float -> float
0.7999999999999999

>>> Fraction(2, 3) ** 2  # exponentiation with integer
Fraction(4, 9)

التحويلات من وإلى الكسور

الكسور رائعة للحفاظ على الدقة أثناء الحسابات الوسيطة، لكنها قد لا تكون ما تريده للنتيجة النهائية.

من الممكن الحصول على البسط والمقام كلًا على حدة أو كصف (tuples ستُناقش في مفهوم لاحق):

>>> Fraction(2, 3).numerator
2
>>> Fraction(2, 3).denominator
3
>>> Fraction(2, 3).as_integer_ratio()
(2, 3)

كما تعطي العديد من دوال Python العددية القياسية النتيجة التي قد تتوقعها من التعامل مع أنواع int و float:

>>> round(Fraction(11, 3))
4

>>> from math import floor, ceil
>>> floor(Fraction(11, 3))
3
>>> ceil(Fraction(11, 3))
4

>>> float(Fraction(11, 3))
3.6666666666666665
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة