JavaRush /جاوا بلاگ /Random-UR /جاوا میں گول نمبر

جاوا میں گول نمبر

گروپ میں شائع ہوا۔
فلوٹنگ پوائنٹ نمبرز (فلوٹ، ڈبل) استعمال کیے جاتے ہیں جب اظہار کا حساب لگاتے ہیں جن کے لیے اعشاریہ درستگی کی ضرورت ہوتی ہے۔ اکاؤنٹنگ اور دیگر کمپیوٹنگ آپریشنز میں اکثر اعلی درستگی کی ضرورت ہوتی ہے۔ جاوا میں گول نمبر - 1لیکن کیا ہمیں ہمیشہ اعشاریہ کے بعد نمبروں کی لمبی "دم" کی ضرورت ہے؟ شاید تین حقیقی حصوں کی درستگی ہمارے لیے کافی ہے؟ اور اگر ہم اس آپشن سے مطمئن ہیں تو راؤنڈنگ کو صحیح طریقے سے کیسے انجام دیا جائے؟ یہ بالکل وہی ہے جس کے بارے میں ہم آج بات کریں گے: ہم جاوا میں نمبروں کو گول کرنے کے طریقے دیکھیں گے ۔

سٹرنگ فارمیٹ

پہلے طریقہ کے طور پر، ہم ڈبل کو راؤنڈنگ دیکھیں گے:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
نتیجتاً، ہم اپنے فلوٹنگ پوائنٹ نمبر 34766674 کو 3 اعشاریہ کی درستگی کے ساتھ فارمیٹ کریں گے ، کیونکہ فارمیٹنگ کی ہدایات میں ہم نے تین اعشاریہ جگہیں "%.3f بتائی ہیں۔ بدلے میں، %f جب کسی سٹرنگ کو فارمیٹ کرتے ہیں تو فلوٹنگ پوائنٹ کی قسم کی نشاندہی کرتا ہے۔ نمبرز، جس میں جاوا میں ڈیٹا ٹائپ ڈبل اور فلوٹ شامل ہے۔ اوپر کی مثال میں، ہم نتیجے میں آنے والی ویلیو کو کنسول میں آؤٹ پٹ کرتے ہیں۔ اب سوال یہ ہے کہ ہم اسے کیسے چھوٹا کر سکتے ہیں؟ یہ آسان ہے: آپ کو printf استعمال کرنے کی ضرورت ہے، جس کے نتیجے میں فارمیٹ + پرنٹ ہے۔ نتیجے کے طور پر، پچھلی ہماری مثال کم ہو جائے گی:
double value = 34.766674;
System.out.printf("%.3f",value);
اس طریقہ کے علاوہ، پرنٹ اسٹریم کلاس کی آؤٹ مثال میں فارمیٹ کا طریقہ بھی ہے، جو اسی طرح کام کرتا ہے:
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 کا استعمال کرتے ہوئے ہماری مثال اس طرح نظر آئے گی :
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### لائن ایک پیٹرن ہے جو اس بات کی نشاندہی کرتی ہے کہ ہم پاس شدہ ویلیو کو 3 ڈیسیمل مقامات پر فارمیٹ کر رہے ہیں۔ DecimalFormat آبجیکٹ بننے کے بعد پیٹرن کو تبدیل کرنے کے لیے، آپ اس کے applyPattern اور 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 کو تین اعشاریہ پر فارمیٹ کرتے ہیں، تو String کا format() طریقہ 7.000 آؤٹ پٹ کرے گا، جبکہ DecimalFormat کا format() طریقہ 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 ایک کلاس ہے جو آپ کو فلوٹنگ پوائنٹ نمبرز کے ساتھ کام کرنے کی اجازت دیتی ہے۔ خاص طور پر، اس کی اہم خصوصیت یہ ہے کہ یہ صوابدیدی لمبائی کے جزوی اعداد کو ذخیرہ کر سکتا ہے (یعنی تعداد کی حد کی کوئی حد نہیں ہے)۔ اس کے علاوہ، یہ کلاس ریاضی کی پروسیسنگ کے لیے مختلف طریقوں کو ذخیرہ کرتی ہے، بشمول راؤنڈنگ۔ اس آبجیکٹ کی کلاس کنسٹرکٹر کو ڈبل، فلوٹنگ پوائنٹ نمبر ڈسپلے کرنے کے لیے سٹرنگ، ڈبل اور MathContext وغیرہ پر سیٹ کر کے بنائی جا سکتی ہے۔ MathContext RoundingMode اور ایک عدد کا مجموعہ ہے جو تلاش کی گئی قدر میں ہندسوں کی کل تعداد کو بیان کرتا ہے۔ گول کرنے کے اصول RoundingMode: DOWN - صفر کی طرف گول کرنا۔ UP — صفر موڈ سے گول کرنا۔ CEILING - مثبت لامحدودیت کی طرف گول کرنا۔ FLOOR - منفی لامحدودیت کی طرف گول کرنا۔ HALF_UP - "قریب ترین پڑوسی" کو گول کرتا ہے اگر دونوں پڑوسی مساوی نہیں ہیں (یعنی جب نمبر 5 ہے)۔ اس صورت میں، راؤنڈ اپ کارکردگی کا مظاہرہ کیا جاتا ہے. HALF_DOWN - "قریب ترین پڑوسی" کی طرف گول کرنا۔ اگر دونوں پڑوسی مساوی نہیں ہیں، تو اس صورت میں گول نیچے۔ HALF_EVEN - "قریب ترین پڑوسی" کی طرف گول کرتا ہے اگر دونوں پڑوسی برابر فاصلے پر نہ ہوں۔ اس صورت میں، برابر پڑوسی کی طرف راؤنڈ (جیسا کہ اوپر بیان کردہ ڈیسیمل فارمیٹ میں)۔ غیر ضروری - اس بات کی تصدیق کے لیے استعمال کیا جاتا ہے کہ درخواست کردہ آپریشن کا صحیح نتیجہ نکلا ہے۔ لہذا، گول کرنے کی ضرورت نہیں ہے. مثال:
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