oss بتاريخ: 20 سبتمبر 2004 تقديم بلاغ مشاركة بتاريخ: 20 سبتمبر 2004 دالة 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; وفق الله الجميع لما يحب و يرضى ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
الأسيف بتاريخ: 22 سبتمبر 2004 تقديم بلاغ مشاركة بتاريخ: 22 سبتمبر 2004 شرح وافي ومميز ... زادك الله أخي الحبيب فهما وعلما ... وأستأذنك أخي الفاضل في نقل هذا الدرس المميز إلى قسم الدروس ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 25 سبتمبر 2004 تقديم بلاغ مشاركة بتاريخ: 25 سبتمبر 2004 واليكم اعزائى المثال المرفق لتعم الفائدة example.doc اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
oss بتاريخ: 27 سبتمبر 2004 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2004 الله يبارك فيكم و يحفظكم جميعا ...الأخ الأسيف ، انقل زي ما تحب ، الغرض هو تعميم الفائدة ... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
husamko_77 بتاريخ: 3 ديسمبر 2004 تقديم بلاغ مشاركة بتاريخ: 3 ديسمبر 2004 بارك الله فيك يا اخي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
سوزان حاتم بتاريخ: 13 ديسمبر 2004 تقديم بلاغ مشاركة بتاريخ: 13 ديسمبر 2004 درس قيم مفيد الله يجزيك الخير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
haitham_ezzt بتاريخ: 7 أغسطس 2005 تقديم بلاغ مشاركة بتاريخ: 7 أغسطس 2005 سلمت يداك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
SYSTEM_MANAGER بتاريخ: 17 أكتوبر 2005 تقديم بلاغ مشاركة بتاريخ: 17 أكتوبر 2005 جزاك الله خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
aza بتاريخ: 19 أكتوبر 2005 تقديم بلاغ مشاركة بتاريخ: 19 أكتوبر 2005 درس مفيد .. الله يجزيك الخير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
السينتور بتاريخ: 15 فبراير 2009 تقديم بلاغ مشاركة بتاريخ: 15 فبراير 2009 مشكورر اخويوبارك الله فيك زماقصرت يابطل والى الامااااام حيب قلبي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.