إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

خصائص مهمة للدالة ROUND


9 رد (ردود) على هذا الموضوع

#1 oss

oss

    مشترك

  • الأعضــاء
  • 98 مشاركة

تاريخ المشاركة 20 September 2004 - 01:18 PM

دالة ROUND هي دالة تقريب أو تدوير الأرقام، و هي دالة معروفة و شائعة الاستخدام في كل المجالات سواء النظرية أو العملية ، و قد قدمت شركة أوراكل إمكانية تقريب التواريخ كما تقريب الأرقام، وقد شرح الأساتذة في المنتدى عملية تقريب التاريخ بتفصيل متميز، لكنني في هذا الموضوع أحببت أن أركز على عملية التقريب للأرقام لأنها مختلفة بعض الشيء عما نعرفه عن استخدام هذه الدالة ...

كما نعريف أن عملية تقريب الأرقام في الرياضيات تعمل على تقليص الخانات العشرية إلى حد معين حسب الحاجة، فمثلا، تقريب الرقم (66.53248) إلى 4 خانات عشرية هو (66.5325)، و إلى خانتين عشريتين هو (66.53)، و تقريبه بدون أي خانات عشرية هو (67) ...
هذا في الرياضيات ، و مانريد معرفته كيف تتعامل أوراكل مع عملية التقريب باستخدام الدالة ROUND ، و قد طرقت هذا الموضوع لأني رأيت إضافات مميزة و اختلافات شديدا في عمل هذه الدالة ...

الصيغة العامة للدالة ROUND:
الصيغة العامة للدالة ROUND هي كما يلي:
ROUND(m,[n])

حيث،
m : هو العدد المراد تقريبه ، و يكون إما اسم عمود أو صيغة
n : هو عدد الخانات العشرية التي يتم تقريب الرقم إليها، وهي قيمة اختيارية إذا أهملت فإن قيمتها الافتراضية هي (0) و سنتعامل معها في الموضوع باسم (رتبة التقريب)
فمثلا،
ROUND(85.6517,3) = 85.652;
ROUND(32.65,1) = 32.7;
ROUND(59.632,0) = 60;
ROUND(59.632) = 60;


لاحظ في المثال الأخير كيف تم التقريب مع أننا لم نذكر عدد الخانات العشرية ...
و مثال بسيط على استخدام الدالة كما يلي :
SELECT ROUND(price,2) FROM sales;


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


تدعم دالة ROUND في أوراكل ميزة مهمة وهي إمكانية التقريب إلى خانات عشرية برقم سالب، أي أن قيمة الوسيط n في الصيغة السابقة تكون قيمة سالبة ، الفائدة من ذلك أن التقريب يتجاوز الفاصلة العشرية إلى جهة اليسار ، فإن التقريب بـ (1-) معناه أن الدالة ROUND تنظر إلى أول رقم على يسار الفاصلة (خانة الآحاد) و تقوم بالتقريب على أساسه فإذا كان أكبر أو يساوي (5) يضيف (1) إلى الخانة الثانية على يسار الفاصلة (خانة العشرات)، و التقريب بـ (2-) تنظر الدالة ROUND إلى الخانة الثانية و تقوم بالتقريب على أساسها ، وهكذا دواليك . لاحظ الأمثلة التالية :
ROUND(3.2,-1) = 0;
ROUND(8,-1) = 10;
ROUND(13.11,-1) = 10;
ROUND(91.7,-1) = 90;
ROUND(95.3,-1) = 100;
ROUND(132.56,-1) = 130;
ROUND(155.8,-1) = 160;
ROUND(996.1,-1) = 1000;
ROUND(6998.1,-1) = 7000;

ROUND(3.2,-2) = 0;
ROUND(8,-2) = 0;
ROUND(13.11,-2) = 0;
ROUND(91.7,-2) = 100;
ROUND(95.3,-2) = 100;
ROUND(132.56,-2) = 100;
ROUND(155.8,-2) = 200;
ROUND(382,-2) = 400;
ROUND(720,-2) = 700;
ROUND(982,-2) = 1000;
ROUND(996.1,-2) = 1000;
ROUND(5372.33,-2) = 6000;

ROUND(3.2,-3) = 0;
ROUND(8,-3) = 0;
ROUND(13.11,-3) = 0;
ROUND(91.7,-3) = 0;
ROUND(95.3,-3) = 0;
ROUND(132.56,-3) = 0;
ROUND(155.8,-3) = 0;
ROUND(382,-3) = 0;
ROUND(720.96,-3) = 1000;
ROUND(982.8,-3) = 1000;
ROUND(996.1,-3) = 1000;
ROUND(3523.21,-3) = 4000;


لاحظ النتائج ، نتائج التقريب بـ (1-) تبدأ بأعداد برتبة صفر واحد ، و نتائج التقريب بـ (2-) تبدأ بأعداد برتبة صفرين ، و نتائج التقريب بـ (3-) تبدأ بأعداد برتبة ثلاثة أصفار ...
أرجو أن يكون المثال قد وضح الفكرة المطلوبة ...

و هناك ملاحظة يجب عدم إغفال ذكرها ، فعند تقريب عدد إلى رتبة n و كان العدد الناتج لا يحتمل البقاء على تلك الرتبة ، فإن الدالة ROUND تقوم بإنقاص الرتبة . المثال التالي يوضح الفكرة :
ROUND(6.596,2) = 6.6;

لاحظ أن التقريب كان مطلوبا إلى الرتبة الثانية (n=2) لكن الناتج لم يتحمل الفائض ، فتقريب الـ (6) إلى الـ (9) ينتج (0) بفائض رقم هو الـ (10) و هنا ينتج خطأ تقريب ، لأن التقريب يكون من رقم بخانتين إلى رقم بخانة واحدة ، وطبعا هذه النتيجة طبيعية باستخدام التقريب الرياضي ...


النقطة الثانية في الموضوع هي نقطة الاختلاف بين التقريب العادي في الرياضيات، و الذي شرحناه في بداية الموضوع، و التقريب في أوراكل باستخدام دالة ROUND ، ويكمن هذا الاختلاف في شيء لاحظته في طبيعة عمل الدالة مع الأرقام المقربة و بخاصة في التعامل مع الوسيط n (راجع الصيغة العامة لدالة ROUND في الأعلى)، و هو شيء غريب بعض الشيء أحببت أن أذكره حتى يتنبه كل من يتعامل مع هذه الدالة ...

نعود إلى الأمثلة التي ذكرناها في بداية الموضوع مع تعديل الرقم المراد تقريبه فيما على يمين الفاصلة و أخذ نتائج إضافية ، تقريب الرقم (66.44448) إلى 4 خانات عشرية هو (66.4445)، و إلى 3 خانات عشرية هو (66.445)، و إلى خانتين عشريتين هو (66.45)، و تقريبه إلى خانة عشرية واحدة هو (66.5) ، و هي نتائج طبيعية لأن التقريب يسير من اليمين إلى اليسار؛ لننظر إلى نتائج الدالة ROUND لنفس العدد :
ROUND(66.44445,4) = 66.4445;
ROUND(66.44445,3) = 66.444;
ROUND(66.44445,2) = 66.44;
ROUND(66.44445,1) = 66.4;


لاحظ اختلاف النتائج عن النتائج الرياضية ، و المهم هو الملاحظة بدقة ماهو الاختلاف ، سأذكر أمثلة أخرى توضح المطلوب :
ROUND(17.34547,4) = 17.3455;
ROUND(17.34547,3) = 17.345;
ROUND(17.34547,2) = 17.35;
ROUND(17.34547,1) = 17.3;


لا حظ النتائج هنا ، كأن التقريب يعمل مرة و مرة لا يعمل ، فمن الطبيعي ، مثلا ، أن النتيجة في السطر الثاني (17.346) و ليس (17.345) لأن التقريب يسير كما ذكرنا من اليمين إلى اليسار ، فالتقريب إلى 3 خانات عشرية يتم على مرحلتين ، الأولى إلى (17.3455) و الثانية إلى (17.346) ، هذا ما يفترض أن يحدث ، و لكن ما الذي يحصل ، و كيف تتعامل الدالة ROUND مع العدد و مع وسيط التقريب ؟
الحقيقة أن الدالة ROUND تتعامل مع العدد المراد تقريبه m حسب وسيط التقريب n بطريقة مختلفة ، فهي تنظر إلى قيمة الوسيط n و تحذف الأرقام على يمين الرقم الذي ترتيبه n على يمين الفاصلة ، أي أنها تنفذ الدالة TRUNC قبل الدالة ROUND بالشكل التالي :
ROUND(TRUNC(m,n+1),n);

و هذا التنفيذ طبعا يتم خلف الكواليس ، أي أنه غير مرأي ، فمثلا ، عند تقريب العدد (2.345) إلى خانة عشرية واحدة يجب أن يكون الناتج ، رياضيا ، (2.35) و ذلك كما وضحنا في الأعلى ، لكننا نلاحظ أن ناتج الدالة ROUND يتم حسابه كما يلي :
ROUND(2.345,1) = ROUND(TRUNC(2.345,2),1)
= ROUND(2.34,1)
= 2.3;

ROUND(56.32645,3) = ROUND(TRUNC(56.32645,4),3)
= ROUND(56.3264,3)
= 56.326;


بقيت ملاحظة بسيطة أحببت أن أذكرها ، و هي أن الوسيط n يجب أن يكون عددا صحيحا ، ولكن ماذا يحدث لو استخدمنا عددا كسريا ؟
تقوم الدالة ROUND بتنفيذ الدالة TRUNC على الوسيط n إلى الرتبة (0) ، أي كما يلي :
ROUND(5.678,2.6) = ROUND(5.678,TRUNC(2.6,0))
= ROUND(5.678,2)
= 5.68;



وفق الله الجميع لما يحب و يرضى ...
أخوكم في الله
oss ...

#2 الأسيف

الأسيف

    مشرف سابق وعضو مميز

  • فريق الإشراف
  • 203 مشاركة
  • الاسم الأول:أنس
  • اسم العائلة:القحطاني
  • البـلـد: Country Flag
  • الاهتمامات:إدارة و تقنية المعلومات الصحية
  • المنصب الحالي:IT Manager at Palestine Medical Center

تاريخ المشاركة 22 September 2004 - 05:18 PM

شرح وافي ومميز ... :ph34r:

زادك الله أخي الحبيب فهما وعلما ...

وأستأذنك أخي الفاضل في نقل هذا الدرس المميز إلى قسم الدروس ...

#3 Osama Soliman

Osama Soliman

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,611 مشاركة
  • الاسم الأول:Osama
  • اسم العائلة:Soliman
  • البـلـد: Country Flag
  • المنصب الحالي:Oracle Technical Consultant - Asfour Crystal International

تاريخ المشاركة 26 September 2004 - 01:07 AM

واليكم اعزائى المثال المرفق لتعم الفائدة

ملفات مرفقة

  • ملف مرفق  example.doc   99كيلو   408 عدد مرات التحميل

وقل رب زدنى علماً
Osama M. Soliman
Oracle Certified Professional
Oracle Technical Consultant

 Asfour Crystal International
Cairo - Egypt
Osama.Soliman@hotmail.com
Osama.Soliman@asfourcystal.com


#4 oss

oss

    مشترك

  • الأعضــاء
  • 98 مشاركة

تاريخ المشاركة 27 September 2004 - 02:23 PM

الله يبارك فيكم و يحفظكم جميعا ...
الأخ الأسيف ، انقل زي ما تحب ، الغرض هو تعميم الفائدة ...
أخوكم في الله
oss ...

#5 husamko_77

husamko_77

    عضو

  • الأعضــاء
  • 10 مشاركة

تاريخ المشاركة 03 December 2004 - 11:00 PM

بارك الله فيك يا اخي

#6 سوزان حاتم

سوزان حاتم

    عضو

  • الأعضــاء
  • 3 مشاركة

تاريخ المشاركة 13 December 2004 - 09:22 PM

درس قيم مفيد الله يجزيك الخير

#7 haitham_ezzt

haitham_ezzt

    عضو نشط

  • الأعضــاء
  • 214 مشاركة

تاريخ المشاركة 07 August 2005 - 05:12 PM

سلمت يداك

صورة


#8 SYSTEM_MANAGER

SYSTEM_MANAGER

    عضو

  • الأعضــاء
  • 2 مشاركة

تاريخ المشاركة 18 October 2005 - 02:01 AM

جزاك الله خير

#9 aza

aza

    عضو نشط

  • الأعضــاء
  • 303 مشاركة

تاريخ المشاركة 19 October 2005 - 10:06 AM

درس مفيد .. الله يجزيك الخير

#10 السينتور

السينتور

    مشترك

  • الأعضــاء
  • 82 مشاركة

تاريخ المشاركة 15 February 2009 - 07:06 PM

مشكورر اخويوبارك الله فيك زماقصرت يابطل

والى الامااااام حيب قلبي