الأعداد الصحيحة والعشرية
تقدّم Python نوعين من الأعداد للعمل اليومي. int هو عدد صحيح مثل 200 سهم. وfloat هو عدد عشري مثل 184.25 وهو سعر. تخبرك type() بنوع القيمة. الكميات المعدودة (الأسهم، اللوطات، الأيام) أعداد int، أما الأسعار والعوائد والنسب فهي float.
shares = 200
price = 184.25
print(type(shares), type(price)) # <class 'int'> <class 'float'>ثلاثة أنواع من القسمة
تعمل + و- و* كما تتوقع. أما القسمة فلها ثلاثة أشكال. / تُرجع دائمًا float حتى في 10 / 2 (أي 5.0). و// هي القسمة الصحيحة: تقسم ثم تُقرّب للأسفل إلى عدد صحيح. و% تعطي الباقي. و** ترفع العدد إلى قوة.
# Division, floor division, remainder and power
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 10) # 1024// نحو سالب ما لا نهاية، لذا -7 // 2 تساوي -4 وليس -3. مع الأعداد الموجبة يبدو الأمر كحذف الكسور، أما مع السالبة فلا.كم سهمًا كاملًا يمكنك شراؤه؟
تجيب القسمة الصحيحة عن سؤال «كم مرة يتسع هذا؟». مع نقد قدره 1,000 وسعر 184.25، فإن cash // price هو عدد الأسهم الكاملة، وcash - shares * price هو المتبقي. مع الأعداد العشرية تُرجع // قيمة float (5.0)، فلفّها بـint() عندما تحتاج عددًا حقيقيًا.
# Whole shares for a cash budget, and the cash left over
cash, price = 1000, 184.25
shares = int(cash // price)
left = cash - shares * price
print(shares, left) # 5 78.75الأعداد العشرية تقريبية
يخزّن float العدد بالنظام الثنائي، ومعظم الأعداد العشرية مثل 0.1 ليس لها تمثيل ثنائي دقيق. تحتفظ Python بأقرب قيمة، فتظهر أخطاء صغيرة جدًا. يحدث هذا في كل اللغات وليس خللًا في Python. القاعدة للمحلل الكمّي: لا تقارن الأعداد float باستخدام ==. استخدم math.isclose التي تسمح بهامش تسامح صغير.
# Floats are approximate: compare with isclose, not ==
import math
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
print(math.isclose(0.1 + 0.2, 0.3)) # Trueالتقريب إلى أقرب تيك
تقرّب round(x, n) إلى n منازل عشرية. لا تقبل البورصات إلا أسعارًا على تيك (مثلًا كل 0.05)، لذا اقسم على التيك وقرّب إلى عدد صحيح من التيكات ثم اضرب مرة أخرى. ولاحظ أن round ترسل النصف التام إلى أقرب عدد زوجي: round(2.5) تساوي 2 وround(3.5) تساوي 4.
# Snap a price to the nearest 5-cent tick
price, tick = 184.267, 0.05
ticks = round(price / tick)
print(ticks, ticks * tick) # 3685 184.25
print(round(2.5), round(3.5)) # 2 4المال بالسنتات الصحيحة
بما أن الأعداد float تقريبية، تحتفظ الأنظمة التي تتطلب الدقة بالمال على شكل عدد صحيح من السنتات. للتحويل اضرب في 100 ثم قرّب. تقتطع int() الكسور فقط، لذا فإن 19.99 * 100 وهي في الحقيقة 1998.9999999999998 ستفقد سنتًا.
# Dollars to integer cents: round, do not truncate
amount = 19.99
print(amount * 100) # 1998.9999999999998
print(int(amount * 100)) # 1998 (a cent is lost)
print(round(amount * 100)) # 1999- الكميات المعدودة (الأسهم، اللوطات، الأيام):
int. - الأسعار والعوائد والنسب:
floatوتُقارن بـmath.isclose. - المال الدقيق: سنتات صحيحة (أو الوحدة
decimal).
التالي: السلاسل النصية وf-strings، حيث تحوّل هذه الأعداد إلى نص مقروء مثل AAPL 184.25 x 184.50.
المختبر: ما الذي يُقيَّم
- احسب عدد الأسهم الكاملة التي تشتريها ميزانية باستخدام
shares_for_cash25 نقطة - أوجد النقد المتبقي باستخدام
leftover_cash25 نقطة - اضبط السعر على أقرب تيك باستخدام
round_to_tick25 نقطة - حوّل الدولارات إلى سنتات صحيحة دقيقة باستخدام
cents25 نقطة