Python دالة round() مع أمثلة

⚡ ملخص ذكي

Python الدالة round() هي دالة مدمجة تقوم بإرجاع قيمة عددية عشرية أو عدد صحيح يتم تقريبها إلى عدد محدد من المنازل العشرية، باستخدام تقريب المصرفيين لكسر التعادلات نحو أقرب رقم زوجي.

  • 🔘 بناء الجملة: تقبل الدالة round(number, ndigits) القيمة المراد تقريبها وعدد الأرقام الاختياري الذي يكون افتراضيًا صفرًا.
  • ☑️ نوع الإرجاع: يؤدي حذف ndigits إلى إرجاع عدد صحيح، بينما يؤدي إدخاله إلى إرجاع عدد عشري.
  • التقريب المصرفي: يتم تقريب القيم المتوسطة إلى أقرب عدد زوجي، لذا فإن round(2.5) تُرجع 2.
  • 🧪 الأرقام السالبة: ينطبق التقريب على القيم السالبة أيضًا، حيث يتم نقل -2.8 إلى -3 و-1.5 إلى -2.
  • 🛠️ أدوات الدقة: تتعامل وحدة decimal و NumPy round() مع التقريب ذي الدقة الثابتة وتقريب المصفوفات.
  • 🤖 سير عمل الذكاء الاصطناعي: يقوم كود التعلم الآلي بتقريب المقاييس والاحتمالات والأوزان للحصول على سجلات وتقارير أكثر وضوحًا.

Python وظيفة مستديرة ().

ما هي دالة round() في Python?

Python الدالة round() هي دالة مدمجة متوفرة مع Pythonستُعيد لك هذه الدالة رقمًا عشريًا يتم تقريبه إلى المنازل العشرية التي تم إدخالها.

إذا لم يتم تحديد الأماكن العشرية التي سيتم تقريبها، فسيتم اعتبارها 0، وسيتم التقريب إلى أقرب عدد صحيح.

بناء الجملة

round(float_num, num_of_decimals)

المعاملات

  • float_num: الرقم العشري المراد تقريبه.
  • عدد المنازل العشرية: (اختياري) عدد المنازل العشرية التي يجب مراعاتها أثناء التقريب. هذا الخيار اختياري، وإذا لم يتم تحديده، فسيتم تعيينه افتراضيًا إلى 0، وسيتم التقريب إلى أقرب عدد صحيح.

الوصف

تأخذ الدالة round() وسيطين:

  • الرقم المراد تقريبه، و
  • المنازل العشرية التي يجب مراعاتها أثناء التقريب.

الوسيط الثاني اختياري وقيمته الافتراضية هي 0 عند عدم تحديده، وفي هذه الحالة، سيتم تقريبه إلى أقرب عدد صحيح، وسيكون نوع الإرجاع أيضًا عددًا صحيحًا.

عند وجود المنازل العشرية، أي الوسيطة الثانية، سيتم تقريبها إلى عدد المنازل المعطاة. سيكون نوع الإرجاع عائمًا.

إذا كان الرقم الذي يلي الفاصلة العشرية هو:

  • إذا كانت القيمة ≥ 5، فسيتم إضافة 1 إلى القيمة النهائية.
  • إذا كانت القيمة أقل من 5، فسيتم إرجاع القيمة النهائية كما هي، حتى المنازل العشرية المذكورة.

قيمة الإرجاع

ستُعيد الدالة قيمة عددية صحيحة إذا لم يتم تحديد عدد المنازل العشرية، وقيمة عشرية إذا تم تحديده. يُرجى ملاحظة أنه سيتم تقريب القيمة إلى +1 إذا كانت القيمة بعد الفاصلة العشرية أكبر من أو تساوي 5، وإلا فستُعيد الدالة القيمة كما هي، حتى عدد المنازل العشرية المذكور.

ما مدى التأثير الذي يمكن أن يحدثه التقريب؟ (التقريب مقابل الاقتطاع)

أفضل مثال لتوضيح تأثير التقريب هو سوق الأوراق المالية. في الماضي، أي في عام 1982، بورصة فانكوفر (VSE) يستخدم لتقريب قيم الأسهم إلى ثلاثة منازل عشرية في كل صفقة.

كان يتم ذلك ما يقارب 3000 مرة يومياً. وأدت عمليات الحذف المتراكمة إلى خسارة حوالي 25 نقطة شهرياً.

يظهر أدناه مثال لاقتطاع القيم مقابل التقريب.

اعتبر الأرقام العشرية الموضحة أدناه بمثابة قيم أسهم. حاليًا، أقوم بإنشائها لنطاق زمني قدره مليون ثانية، يتراوح بين 0.01 و0.05.

أمثلة:

arr = [random.uniform(0.01, 0.05) for _ in range(1000000)]

لإظهار تأثير التقريب، كتبت جزءًا صغيرًا من التعليمات البرمجية حيث تستخدم في البداية الأرقام حتى 3 منازل عشرية فقط، أي اقتطاع الرقم بعد 3 منازل عشرية.

لدي القيمة الإجمالية الأصلية، والمجموع الناتج عن القيم المقتطعة، والفرق بين القيمة الأصلية والقيمة المقتطعة.

على نفس مجموعة الأرقام، استخدمت طريقة round() حتى 3 منازل عشرية وحسبت المجموع والفرق بين القيمة الأصلية والقيمة المقربة.

إليكم المثال والنتيجة.

مثال 1

import random

def truncate(num):
    return int(num * 1000) / 1000

arr = [random.uniform(0.01, 0.05) for _ in range(1000000)]
sum_num = 0
sum_truncate = 0
for i in arr:
    sum_num = sum_num + i  
    sum_truncate = truncate(sum_truncate + i)
  
print("Testing by using truncating upto 3 decimal places")
print("The original sum is = ", sum_num)
print("The total using truncate = ", sum_truncate)
print("The difference from original - truncate = ", sum_num - sum_truncate)

print("\n\n")
print("Testing by using round() upto 3 decimal places")
sum_num1 = 0
sum_truncate1 = 0
for i in arr:
    sum_num1 = sum_num1 + i  
    sum_truncate1 = round(sum_truncate1 + i, 3)

print("The original sum is =", sum_num1)
print("The total using round = ", sum_truncate1)
print("The difference from original - round =", sum_num1 - sum_truncate1)

الإخراج:

Testing by using truncating upto 3 decimal places
The original sum is =  29985.958619386867
The total using truncate =  29486.057
The difference from original - truncate =  499.9016193868665

Testing by using round() up to 3 decimal places
The original sum is = 29985.958619386867
The total using round =  29985.912
The difference from original - round = 0.04661938686695066

الفرق بين القيمة الأصلية والقيمة المقطوعة هو 499.9016193868665، ومن دالة round()، يكون 0.04661938686695066.

يبدو أن الفرق كبير جدًا، ويوضح المثال كيف تساعد طريقة round() في الحساب بدقة قريبة من الدقة.

مثال: تقريب التعويم Numbers

سنرى في هذا البرنامج كيف تعمل عملية التقريب على الأرقام العشرية.

# testing round()

float_num1 = 10.60 # here the value will be rounded to 11 as after the decimal point the number is 6 that is >5

float_num2 = 10.40 # here the value will be rounded to 10 as after the decimal point the number is 4 that is <=5

float_num3 = 10.3456 # here the value will be 10.35 as after the 2 decimal points the value >=5

float_num4 = 10.3445 #here the value will be 10.34 as after the 2 decimal points the value is <5

print("The rounded value without num_of_decimals is :", round(float_num1))
print("The rounded value without num_of_decimals is :", round(float_num2))
print("The rounded value with num_of_decimals as 2 is :", round(float_num3, 2))
print("The rounded value with num_of_decimals as 2 is :", round(float_num4, 2))

الإخراج:

The rounded value without num_of_decimals is : 11
The rounded value without num_of_decimals is : 10
The rounded value with num_of_decimals as 2 is : 10.35
The rounded value with num_of_decimals as 2 is : 10.34

مثال: تقريب القيم الصحيحة

إذا كنت تستخدم round() على قيمة عددية، فسوف يعيد لك الرقم مرة أخرى دون أي تغييرات.

# testing round() on a integer

num = 15

print("The output is", round(num))

الإخراج:

The output is 15

مثال: التقريب إلى السالب Numbers

دعونا نرى بعض الأمثلة على كيفية عمل التقريب على الأعداد السالبة.

# testing round()

num = -2.8
num1 = -1.5
print("The value after rounding is", round(num))
print("The value after rounding is", round(num1))

الإخراج:

C:\pythontest>python testround.py
The value after rounding is -3
The value after rounding is -2

مثال: تقريب مصفوفات NumPy

كيف يتم تقريب الأرقام في NumPy؟ المصفوفات في Python?

لحل هذه المشكلة، يمكننا استخدام وحدة NumPy واستخدام طريقة numpy.round() أو numpy.around()، كما هو موضح في المثال أدناه.

باستخدام numpy.round()

# testing round()
import numpy as np

arr = [-0.341111, 1.455098989, 4.232323, -0.3432326, 7.626632, 5.122323]

arr1 = np.round(arr, 2)

print(arr1)

الإخراج:

C:\pythontest>python testround.py
[-0.34  1.46  4.23 -0.34  7.63  5.12]

يمكننا أيضًا استخدام numpy.around()، والذي يعطيك نفس نتيجة numpy.round() الموضحة أعلاه.

مثال: الوحدة العشرية

بالإضافة إلى دالة round()، Python يحتوي على وحدة عشرية تساعد في التعامل مع الأرقام العشرية بدقة أكبر.

تأتي وحدة الأعداد العشرية مزودة بأنواع التقريب، كما هو موضح أدناه:

  • سقف دائري: سوف تقترب من اللانهاية.
  • ROUND_DOWN: سيتم تقريب القيمة إلى الصفر.
  • الطابق الدائري: سوف تقترب من سالب ما لا نهاية.
  • ROUND_HALF_DOWN: سيتم تقريبها إلى أقرب قيمة تقترب من الصفر.
  • ROUND_HALF_EFN: سيتم تقريبها إلى أقرب قيمة، أي إلى أقرب عدد زوجي صحيح.
  • ROUND_HALF_UP: سيتم تقريبها إلى أقرب قيمة بعيدة عن الصفر.
  • جمع الشمل: سيتم تقريب القيمة عندما تبتعد عن الصفر.

في النظام العشري، تساعد طريقة quantize() على التقريب إلى عدد ثابت من المنازل العشرية، ويمكنك تحديد التقريب المطلوب استخدامه، كما هو موضح في المثال أدناه.

على سبيل المثال: باستخدام الطرق المستديرة () والعشرية

import  decimal
round_num = 15.456

final_val = round(round_num, 2)

#Using decimal module
final_val1 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_CEILING)
final_val2 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_DOWN)
final_val3 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_FLOOR)
final_val4 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_HALF_DOWN)
final_val5 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_HALF_EVEN)
final_val6 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_HALF_UP)
final_val7 = decimal.Decimal(round_num).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP)

print("Using round()", final_val)
print("Using Decimal - ROUND_CEILING ",final_val1)
print("Using Decimal - ROUND_DOWN ",final_val2)
print("Using Decimal - ROUND_FLOOR ",final_val3)
print("Using Decimal - ROUND_HALF_DOWN ",final_val4)
print("Using Decimal - ROUND_HALF_EVEN ",final_val5)
print("Using Decimal - ROUND_HALF_UP ",final_val6)
print("Using Decimal - ROUND_UP ",final_val7)

الإخراج:

Using round() 15.46
Using Decimal - ROUND_CEILING  15.46
Using Decimal - ROUND_DOWN  15.45
Using Decimal - ROUND_FLOOR  15.45
Using Decimal - ROUND_HALF_DOWN  15.46
Using Decimal - ROUND_HALF_EVEN  15.46
Using Decimal - ROUND_HALF_UP  15.46
Using Decimal - ROUND_UP  15.46

الأسئلة الشائعة

رقم Python 3 يستخدم التقريب إلى النصف (تقريب المصرفي) في حالة التعادل، لذا فإن round(0.5) هو 0، و round(2.5) هو 2، و round(3.5) هو 4. هذا يقلل من التحيز التراكمي.

لأن العدد 2.675 لا يمكن تخزينه بدقة في نظام الفاصلة العائمة الثنائية؛ بل يُخزّن فعلياً على أنه حوالي 2.6749999999999998، فإن الدالة round() تُقرّبه إلى العدد الأدنى. للحصول على نتائج دقيقة، استخدم decimal.Decimal('2.675').

استخدم وحدة الرياضيات: دالة math.ceil(x) تقرّب دائمًا لأعلى، ودالة math.floor(x) تقرّب دائمًا لأسفل، ودالة int(x) تقرّب باتجاه الصفر. أما دالة round() نفسها فلا يمكنها فرض اتجاه ثابت.

مرر وسيطًا ثانيًا سالبًا: round(12345, -1) يعطي 12340، round(12345, -2) يعطي 12300، و round(12345, -3) يعطي 12000. عدد الأرقام السالبة ndigits يُقرّب إلى يسار الفاصلة العشرية.

تُغيّر الدالة round(x, 2) القيمة المستخدمة في العمليات الحسابية اللاحقة، بينما تقوم الدالة f'{x:.2f}' بتنسيق العرض فقط مع الحفاظ على الرقم كما هو. استخدم الدالة round() لإجراء العمليات الحسابية، والسلاسل النصية f-strings للإخراج.

رقم Numbers بما أن القيم غير قابلة للتغيير، فإن الدالة round() تُعيد قيمة جديدة دون تغيير مُدخلاتها. عند إسناد قيمة لها، على سبيل المثال result = round(3.14159, 2)؛ يحتفظ المتغير الأصلي بدقته الكاملة.

يقوم كود التعلم الآلي بتقريب قيم الدقة والخسارة والاحتمالية للحصول على سجلات قابلة للقراءة، ولربط التنبؤات بتصنيفات الفئات. احتفظ بالدقة الكاملة لحسابات التدرج، وقم بتقريب المقاييس النهائية المعروضة فقط.

نعم. مساعدو الذكاء الاصطناعي مثل GitHub Copilot إكمال تلقائي round() و np.round() والتقريب العشري من تعليق أو اسم دالة، والأدوات الآلية تعيد هيكلة التنسيق اليدوي إلى استدعاءات round()، على الرغم من أن الدقة المختارة لا تزال بحاجة إلى مراجعة.

تلخيص هذه التدوينة بـ: