JavaRush /مدونة جافا /Random-AR /تقريب الأرقام في جافا

تقريب الأرقام في جافا

نشرت في المجموعة
يتم استخدام أرقام الفاصلة العائمة (العائمة والمزدوجة) عند حساب التعبيرات التي تتطلب دقة عشرية. غالبًا ما تكون هناك حاجة إلى دقة عالية في المحاسبة وعمليات الحوسبة الأخرى. تقريب الأرقام في جافا - 1ولكن هل نحتاج دائمًا إلى "ذيل" طويل من الأرقام بعد العلامة العشرية؟ ربما دقة ثلاثة أجزاء حقيقية كافية بالنسبة لنا؟ وإذا كنا راضين عن هذا الخيار، فكيف يتم التقريب بشكل صحيح؟ هذا هو بالضبط ما سنتحدث عنه اليوم: سننظر في طرق تقريب الأرقام في Java .

تنسيق السلسلة

كطريقة أولى، سننظر إلى التقريب للعدد المزدوج:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
نتيجة لذلك، سنقوم بتنسيق رقم الفاصلة العائمة 34766674 بدقة 3 منازل عشرية ، نظرًا لأننا حددنا في تعليمات التنسيق ثلاث منازل عشرية "%.3f". وفي المقابل، يشير %f عند تنسيق سلسلة إلى نوع النقطة العائمة الأرقام، والتي تتضمن نوع البيانات double و float في Java. في المثال أعلاه، قمنا بإخراج القيمة الناتجة إلى وحدة التحكم. والسؤال الآن هو: كيف يمكننا تقصير هذا؟ الأمر بسيط: تحتاج إلى استخدام printf، والذي بدوره هو تنسيق + طباعة، ونتيجة لذلك، سيتم تقليل مثالنا السابق إلى:
double value = 34.766674;
System.out.printf("%.3f",value);
بالإضافة إلى هذه الطريقة ، يحتوي المثيل الخارجي لفئة PrintStream أيضًا على طريقة تنسيق تعمل بشكل مشابه:
double value = 34.766674;
System.out.format("%.3f",value);
يتم التقريب في الوضع HALF_UP - باتجاه الرقم الأقرب إلى القطع (إلى 0 أو 10). إذا كانت هذه الأرقام متساوية البعد (في حالة 5)، فسيتم التقريب للأعلى. مثال:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
سنناقش أوضاع التقريب بمزيد من التفاصيل أدناه. تقريب الأرقام في جافا - 2

تنسيق عشري

خيار آخر هو استخدام فئة DecimalFormat . إنه مصمم لتنسيق أي رقم في Java، سواء كان عددًا صحيحًا أو رقمًا عائمًا. عندما نقوم بإنشاء مثيل DecimalFormat، يمكننا تمرير سلسلة تنسيق إليه. سيشير إلى عدد المنازل العشرية المطلوب تنسيقها للإدخال. هذا ما سيبدو عليه مثالنا باستخدام DecimalFormat :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
السطر #.### هو نمط يشير إلى أننا نقوم بتنسيق القيمة التي تم تمريرها إلى 3 منازل عشرية. لتغيير النمط بعد إنشاء كائن DecimalFormat، يمكنك استخدام التابعين applicationPattern و applyLocalizedPattern :
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
لكن اليوم نتحدث عن التقريب، أليس كذلك؟ عند اقتطاع رقم بمنازل عشرية خارج النمط المحدد، يقوم DecimalFormat بتقريب الرقم لأعلى إذا كان الرقم الأخير المقطوع أكبر من 5. ولكن ماذا لو كان الرقم 5؟ اتضح أنه يقع بالضبط في المنتصف بين أقرب الأعداد الصحيحة. ماذا بعد؟ وفي هذه الحالة يؤخذ الرقم السابق بعين الاعتبار. إذا كان زوجيًا، يتم التقريب:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
إذا كان غريبا، لا يتم تنفيذه:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
هناك اختلاف بسيط بين تنسيق أرقام الفاصلة العائمة باستخدام String.format() وDecimalFormat.format(). سيطبع الأول دائمًا أصفارًا زائدة حتى لو لم يكن هناك جزء كسري. على سبيل المثال:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
كما نرى، عند تنسيق الرقم 7.000132 إلى ثلاث منازل عشرية، فإن طريقة String format() ستخرج 7.000، بينما ستنتج طريقة format() الخاصة DecimalFormat 7. أي أنه يمكنك اختيار String.format() أو DecimalFormat.format( ) اعتمادًا على ما إذا كنت بحاجة إلى أصفار زائدة أم لا. باستخدام الطرق الموضحة أعلاه، حصلنا على النتيجة في شكل سلسلة. دعونا نلقي نظرة على طرق استعادة القيم الرقمية بالضبط.

الرياضيات

ومن المستحيل عدم ذكر فئة خاصة مصممة لمختلف العمليات الحسابية مع الأرقام - الرياضيات . تقريب الأرقام في جافا - 3تحتوي هذه الفئة أيضًا على طرق للتقريب، ولكن على عكس تلك الموصوفة مسبقًا، فهي لا تسمح لك بتعيين عدد معين من المنازل العشرية، بل تتيح لك التقريب إلى عدد صحيح:
  • يقوم Math.ceil() بالتقريب إلى أقرب عدد صحيح، لكنه لا يُرجع نوعًا عددًا صحيحًا، بل يُرجع عددًا مزدوجًا:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    حتى لو كان لدينا 34.0000000، بعد استخدام Math.ceil سنظل نحصل على 35.0.

    يتم تقريب Math.floor()‎ إلى أقرب عدد صحيح، وإرجاع النتيجة أيضًا مزدوجة:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    مرة أخرى، حتى لو كانت لدينا قيمة 34.999999999، فبعد استخدام Math.floor سنحصل على 34.0.

  • Math.round () - يتم التقريب إلى أقرب عدد صحيح، مما يعطي النتيجة int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    إذا كان الرقم 34.5، فسيتم تقريبه إلى 35، ولكن إذا كان أقل قليلاً من 34.499، فسيتم اقتطاع الرقم إلى 34.

    من أجل عدم قطع الجزء الحقيقي بأكمله ببساطة، ولكن لتنظيم هذه العملية إلى عدد معين من المنازل العشرية وفي نفس الوقت تقريبًا، يتم ضرب الرقم في 10^n (10 أس n)، حيث n يساوي عدد المنازل العشرية اللازمة. بعد ذلك، يتم استخدام بعض أساليب فئة الرياضيات للتقريب، ثم يتم تقسيمها مرة أخرى على 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - يأخذ وسيطتين. الأول هو الرقم، والثاني هو القوة التي يجب رفعها إليها.

التقريب باستخدام BigDecimal

BigDecimal هي فئة تسمح لك بالعمل مع أرقام الفاصلة العائمة. على وجه الخصوص، الميزة الرئيسية هي أنه يمكن تخزين أرقام كسرية ذات طول تعسفي (أي أنه لا يوجد حد لنطاق الرقم). بالإضافة إلى ذلك، يقوم هذا الفصل بتخزين طرق مختلفة للمعالجة الحسابية، بما في ذلك التقريب. يمكن إنشاء فئة هذا الكائن عن طريق ضبط المُنشئ على double، والسلسلة لعرض رقم الفاصلة العائمة، وdouble، و MathContext ، وما إلى ذلك. MathContext عبارة عن مزيج من RoundingMode ورقم يصف إجمالي عدد الأرقام في القيمة التي تم البحث عنها. قواعد التقريب وضع التقريب: DOWN - التقريب نحو الصفر. UP - التقريب من وضع الصفر. السقف - التقريب نحو اللانهاية الإيجابية. FLOOR - التقريب نحو اللانهاية السالبة. HALF_UP - يتم التقريب إلى "أقرب جار" إذا لم يكن كلا الجيران على مسافة متساوية (أي عندما يكون الرقم الذي يتم تقريبه هو 5). في هذه الحالة، يتم تنفيذ التقريب. HALF_DOWN - التقريب نحو "أقرب جار". إذا لم يكن كلا الجيران على مسافة متساوية، في هذه الحالة قم بالتقريب للأسفل. HALF_EVEN - يتم التقريب إلى "أقرب جار" إذا لم يكن كلا الجيران على مسافة متساوية. في هذه الحالة، قم بالتقريب إلى الجار الزوجي (كما في DecimalFormat الموضح أعلاه). غير ضروري - يستخدم للتأكيد على أن العملية المطلوبة لها النتيجة الصحيحة. ولذلك، التقريب غير مطلوب. مثال:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
بالإضافة إلى القدرة على تعيين قاعدة التقريب في المُنشئ، يتيح لك BigDecimal ضبط وضع التقريب بعد إنشاء المثيل. للقيام بذلك، استخدم طريقة setScale ، حيث تحتاج إلى تعيين عدد المنازل العشرية وقواعد التقريب:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
يحتوي BigDecimal أيضًا على متغيرات int داخلية مصممة لتعيين وضع التقريب ( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...) هذه هي قواعد تقريب مشابهة لتلك المقدمة في فئة RoundingMode وتستخدم بالمثل في setScale :
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
اقرأ المزيد عن فئة BigDecimal في هذه المقالة .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION