JavaRush /وبلاگ جاوا /Random-FA /گرد کردن اعداد در جاوا

گرد کردن اعداد در جاوا

در گروه منتشر شد
اعداد ممیز شناور (شناور، دو برابر) هنگام محاسبه عباراتی که نیاز به دقت اعشاری دارند استفاده می شود. دقت بالا اغلب در حسابداری و سایر عملیات محاسباتی مورد نیاز است. گرد کردن اعداد در جاوا - 1اما آیا ما همیشه به یک "دم" طولانی اعداد بعد از نقطه اعشار نیاز داریم؟ شاید دقت سه قسمت واقعی برای ما کافی باشد؟ و اگر از این گزینه راضی بودیم چگونه می توان گردگیری را به درستی انجام داد؟ این دقیقاً همان چیزی است که امروز در مورد آن صحبت خواهیم کرد: به روش هایی برای گرد کردن اعداد در جاوا خواهیم پرداخت .

قالب رشته

به عنوان اولین روش، به گرد کردن دوبرابر خواهیم پرداخت:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
در نتیجه، شماره ممیز شناور خود 34766674 را با دقت 3 رقم اعشار قالب‌بندی می‌کنیم ، زیرا در دستورالعمل‌های قالب‌بندی سه رقم اعشار "%.3f" را مشخص کرده‌ایم. به نوبه خود، %f هنگام قالب‌بندی یک رشته، نوع ممیز شناور را نشان می‌دهد. اعداد، که شامل نوع داده double و float در جاوا می شود. در مثال بالا، مقدار حاصل را به کنسول خروجی می دهیم. حال سوال این است: چگونه می توانیم این را کوتاه کنیم؟ ساده است: شما باید از printf استفاده کنید، که به نوبه خود فرمت + چاپ است. در نتیجه، مثال قبلی ما به:
double value = 34.766674;
System.out.printf("%.3f",value);
علاوه بر این متد ، نمونه out از کلاس 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

گزینه دیگر استفاده از کلاس DecimalFormat است . این برای قالب بندی هر عددی در جاوا طراحی شده است، اعم از عدد صحیح یا ممیز شناور. وقتی 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("#.#####");
اما امروز ما در مورد گرد کردن صحبت می کنیم، اینطور نیست؟ هنگام کوتاه کردن یک عدد با اعداد اعشاری فراتر از الگوی مشخص شده، اگر آخرین عدد کوتاه شده بزرگتر از 5 باشد، DecimalFormat عدد را به سمت بالا گرد می کند. اما اگر عدد 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 به سه رقم اعشار، متد format() String 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 برمی گرداند:

    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 برابر است با تعداد ارقام اعشاری لازم. پس از این، از روشی از کلاس Math برای گرد کردن استفاده می شود و سپس دوباره بر 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 و عددی است که تعداد کل ارقام در مقدار جستجو شده را توصیف می کند. قوانین گرد کردن RoundingMode: DOWN - گرد کردن به سمت صفر. بالا - گرد کردن از حالت صفر. سقف - گرد شدن به سمت بی نهایت مثبت. 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