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

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

صورة
- - - - -

شرح الداله Round


لا توجد ردود على هذا الموضوع

#1 sameh bakkar

sameh bakkar

    مشرف قسم المبتدئين

  • فريق الإشراف
  • 1,019 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 28 August 2008 - 10:18 AM

بسم الله الرحمن الرحيم

أخوانى فى الله .... و الله لأنى أحبكم فى الله .. فى الواقع قرأت هذا الموضوع على الأنترنت و قد اعجبنى كثيرا لما فيه من تسلسل فى عرض الأفكار و الأمثله الكثيره فقررت ان انقل هذا الموضوع الى اخوانى الأعضاء لعله يكون مفيد حتى و لو لعضو واحد فقط

بسم الله نبدأ:


دالة 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;


جزاه الله كل خير من قام بإعداد هذا الشرح الرائع ...
  • merommmm معجب بهذا

Sameh Bakkar

Principal Oracle Apps Techno-Functional Consultant / Oracle E-Business Suite Certified Trainer

Oracle E-Business R11 Suite Applications Workflow Certified Expert

Oracle E-Business Suite R12 HCM Certified Implementation Specialist

Oracle Certified Professional

ITIL V3 Foundation certified

Microsoft Project certified




الموقع الخاص: AppsLead | Your Honest Guide | Sameh Bakkar