JavaRush /جاوا بلاگ /Random-UR /جاوا میں بگ ڈیسیمل

جاوا میں بگ ڈیسیمل

گروپ میں شائع ہوا۔
ہیلو! آج کے لیکچر میں ہم بڑی تعداد کے بارے میں بات کریں گے۔ نہیں، واقعی بڑے لوگوں کے بارے میں۔ اس سے پہلے ، ہم نے ایک سے زیادہ مرتبہ ڈیٹا کی ابتدائی اقسام کے لیے قدر کی حدود کا جدول دیکھا ہے۔ وہ اس طرح نظر آتی ہے:
قدیم قسم میموری میں سائز اقدار کی حد
بائٹ 8 بٹ -128 سے 127
مختصر 16 بٹ -32768 سے 32767 تک
چار 16 بٹ 0 سے 65536 تک
int 32 بٹس -2147483648 سے 2147483647 تک
طویل 64 بٹس -9223372036854775808 سے 9223372036854775807
تیرنا 32 بٹس (2 سے پاور -149) تک ((2-2 سے پاور -23)*2 سے پاور 127)
دگنا 64 بٹس (-2 سے 63 کی طاقت تک) تک (2 سے 63 کی طاقت تک) - 1)
بولین 8 (جب صفوں میں استعمال ہوتا ہے)، 32 (جب غیر صفوں میں استعمال ہوتا ہے) صحیح یا غلط
اگر ہم انٹیجرز کے بارے میں بات کر رہے ہیں تو، سب سے زیادہ گنجائش والے ڈیٹا کی قسم لمبی ہے ، اور جب ہم فلوٹنگ پوائنٹ نمبرز کے بارے میں بات کر رہے ہیں، تو ڈبل ۔ لیکن کیا ہوگا اگر ہمیں جس تعداد کی ضرورت ہے وہ اتنی بڑی ہے کہ یہ لمبے عرصے میں بھی فٹ نہیں ہے ؟ ممکنہ لمبی اقدار کی حد کافی بڑی ہے، لیکن پھر بھی ایک خاص سائز تک محدود ہے - 64 بٹس۔ اگر ہمارے بہت بڑے نمبر کا وزن 100 بٹس ہو تو ہم کیا لے سکتے ہیں؟ خوش قسمتی سے، آپ کو کچھ بھی ایجاد کرنے کی ضرورت نہیں ہے۔ جاوا میں، اس طرح کے معاملات کے لیے دو خصوصی کلاسز بنائے گئے تھے - BigInteger (انٹیجرز کے لیے) اور BigDecimal (فلوٹنگ پوائنٹ نمبرز کے لیے)۔ ان کی خصوصیت کیا ہے؟ سب سے پہلے، وہ نظریاتی طور پر کوئی زیادہ سے زیادہ سائز نہیں ہے. نظریاتی طور پر، کیونکہ لامحدود میموری والے کمپیوٹر نہیں ہیں۔ اور اگر آپ پروگرام میں کوئی ایسا نمبر بناتے ہیں جو کمپیوٹر کی میموری کے سائز سے بڑا ہو تو یقیناً یہ پروگرام کام نہیں کرے گا۔ لیکن ایسے معاملات کا امکان نہیں ہے۔ لہذا، ہم کہہ سکتے ہیں کہ اعداد کا سائز عملی طور پر لامحدود BigIntegerہے ۔ BigDecimalیہ کلاسیں کس کے لیے استعمال ہوتی ہیں؟ سب سے پہلے، انتہائی اعلی درستگی کے تقاضوں کے ساتھ حساب کے لیے۔ مثال کے طور پر ایسے پروگرام ہیں جن میں انسانی زندگی حساب کی درستگی پر منحصر ہو سکتی ہے (ہوائی جہازوں اور راکٹوں یا طبی آلات کے لیے سافٹ ویئر)۔ لہذا، اگر 150 واں اعشاریہ بھی اہم کردار ادا کرتا ہے، BigDecimalتو یہ بہترین انتخاب ہے۔ اس کے علاوہ، اکثر یہ اشیاء فنانس کی دنیا میں استعمال ہوتی ہیں، جہاں چھوٹی اقدار تک حساب کی درستگی بھی انتہائی اہم ہے۔ اشیاء کے ساتھ کام کیسے کریں BigIntegerاور BigDecimalان کے بارے میں کیا یاد رکھنا ضروری ہے؟ ان کلاسوں کے آبجیکٹ اس طرح بنائے گئے ہیں:
public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigDecimal decimal = new BigDecimal("123.444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444");
       System.out.println(decimal);
   }
}
پیرامیٹر کے طور پر سٹرنگ کو پاس کرنا ممکنہ کنسٹرکٹرز میں سے صرف ایک ہے۔ یہاں ہم سٹرنگز کا استعمال کرتے ہیں کیونکہ ہمارے نمبرز زیادہ سے زیادہ قدروں سے زیادہ ہیں longاور double، اور کسی نہ کسی طرح ہمیں کمپائلر کو یہ بتانے کی ضرورت ہے کہ ہم کون سا نمبر حاصل کرنا چاہتے ہیں :) بس نمبر کو پاس کریں 1111111111111111111111111111111111111111111111111111111۔ 1111111111111 کام نہیں کرے گا: جاوا "فٹ" کرنے کی کوشش کرے گا۔ نمبر کو ڈیٹا کی قدیم اقسام میں سے ایک میں منتقل کیا گیا ہے، لیکن یہ ان میں سے کسی میں بھی فٹ نہیں ہوگا۔ لہذا، مطلوبہ نمبر پاس کرنے کے لیے سٹرنگ کا استعمال ایک اچھا آپشن ہے۔ دونوں کلاسز خود بخود پاس شدہ تاروں سے عددی قدریں نکال سکتے ہیں۔ بڑی تعداد میں کلاسوں کے ساتھ کام کرتے وقت یاد رکھنے کا ایک اور اہم نکتہ یہ ہے کہ ان کی اشیاء ناقابل تغیر ( Immutable) ہیں ۔ Stringآپ پہلے سے ہی پرائمیٹوز (انٹیجر، لانگ اور دیگر) کے لیے کلاس اور ریپر کلاسز کی مثال سے عدم تغیر کے اصول سے بخوبی واقف ہیں ۔
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       integer.add(BigInteger.valueOf(33333333));
       System.out.println(integer);

   }
}
کنسول آؤٹ پٹ:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
ہمارے نمبر نہیں بدلے ہیں، جیسا کہ آپ کی توقع تھی۔ اضافی آپریشن کے کامیاب ہونے کے لیے، آپ کو ایک نیا آبجیکٹ بنانا ہوگا اور اس میں اضافے کا نتیجہ تفویض کرنا ہوگا۔
import java.math.BigInteger;

public class Main {

   public static void main(String[] args) {

       BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
       System.out.println(integer);

       BigInteger result = integer.add(BigInteger.valueOf(33333333));
       System.out.println(result);

   }
}
کنسول آؤٹ پٹ:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
اب سب کچھ ویسا ہی کام کرتا ہے جیسا کہ ہونا چاہیے :) ویسے، کیا آپ نے دیکھا کہ اضافی آپریشن کتنا غیر معمولی لگتا ہے؟
BigInteger result = integer.add(BigInteger.valueOf(33333333));
یہ ایک اور اہم نکتہ ہے۔ بڑی تعداد میں کلاسیں اپنے آپریشن میں +-*/ آپریٹرز کا استعمال نہیں کرتی ہیں، بلکہ اس کے بجائے طریقوں کا ایک سیٹ فراہم کرتی ہیں۔ آئیے اہم پر ایک نظر ڈالیں (آپ ہمیشہ کی طرح اوریکل دستاویزات میں طریقوں کی مکمل فہرست تلاش کر سکتے ہیں: یہاں اور یہاں
  1. ریاضی کی کارروائیوں کو انجام دینے کے طریقے: add() , subtract(), multiply(), divide(). بالترتیب اضافے، گھٹاؤ، ضرب اور تقسیم کی کارروائیوں کے لیے استعمال کیا جاتا ہے۔

  2. doubleValue()،،،، وغیرہ intValue()_ _ - ایک بڑی تعداد کو جاوا قدیم قسم میں تبدیل کرنے کے لیے استعمال کیا جاتا ہے۔ ان کا استعمال کرتے وقت محتاط رہیں اور صلاحیت میں فرق کو یاد رکھیں!floatValue()longValue()

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
    
           long result = integer.longValue();
           System.out.println(result);
    
       }
    }

    کنسول آؤٹ پٹ:

    
    8198552921648689607
  3. min()اور max()- آپ کو گزرے ہوئے دو بڑے نمبروں کی کم از کم اور زیادہ سے زیادہ قیمت تلاش کرنے کی اجازت دیتا ہے۔
    براہ کرم نوٹ کریں: طریقے جامد نہیں ہیں!

    import java.math.BigInteger;
    
    public class Main {
    
       public static void main(String[] args) {
    
           BigInteger integer = new BigInteger("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
           BigInteger integer2 = new BigInteger("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222");
    
           System.out.println(integer.max(integer2));
    
       }
    }

    کنسول آؤٹ پٹ:

    
    222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

بگ ڈیسیمل راؤنڈنگ کنٹرول

اس موضوع کو ایک علیحدہ حصے میں شامل کیا گیا ہے، کیونکہ بڑی تعداد کو گول کرنا اور اسے ایڈجسٹ کرنا کوئی آسان بات نہیں ہے۔ BigDecimalآپ کا استعمال کرتے ہوئے ایک عدد کے لیے اعشاریہ مقامات کی تعداد مقرر کر سکتے ہیں setScale()۔ مثال کے طور پر، ہم نمبر 111.5555555555 کی درستگی کو تین اعشاریہ پر سیٹ کرنا چاہتے ہیں۔ تاہم، ہم طریقہ کی دلیل کے طور پر نمبر 3 کو پاس نہیں کر سکیں گے setScale()اور اس طرح اپنا مسئلہ حل کر سکیں گے۔ جیسا کہ اوپر ذکر کیا گیا ہے، BigDecimalیہ زیادہ درستگی کے ساتھ حساب کے لیے اعداد ہیں۔ اس کی موجودہ شکل میں، ہمارے نمبر میں 10 اعشاریہ مقامات ہیں۔ ہم ان میں سے 7 کو ضائع کرنا چاہتے ہیں اور صرف 3 کو چھوڑنا چاہتے ہیں۔ لہذا، نمبر 3 کے علاوہ، ہمیں پیرامیٹر کے طور پر راؤنڈنگ موڈ کو پاس کرنا ہوگا ۔ مجموعی طور پر 8 راؤنڈنگ موڈز ہیں BigDecimal۔ کافی زیادہ! لیکن اگر آپ کو پروگرام میں حسابات کی درستگی کو واقعی ٹھیک کرنے کی ضرورت ہے، تو آپ کے پاس اس کے لیے درکار ہر چیز موجود ہوگی۔ تو، یہاں 8 راؤنڈنگ موڈز دستیاب ہیں BigDecimal:
  1. ROUND_CEILING--.گراونڈ کرنا n

    111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
  2. ROUND_DOWN--.خارج خارج کرنا n

    111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
  3. ROUND_FLOOR--.نیچے گول کرنا

    111.5555555555 -> setScale(3, ROUND_FLOOR) -> 111.555

  4. ROUND_HALF_UPاگر اعشاریہ کے بعد نمبر >= .5 ہو تو راؤنڈنگ اپ

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWNاگر اعشاریہ کے بعد نمبر > .5 ہو تو راؤنڈنگ اپ

    0.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5
    0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.6
  6. ROUND_HALF_EVEN- راؤنڈنگ اعشاریہ کے بائیں طرف کی تعداد پر منحصر ہوگی۔ اگر بائیں طرف نمبر برابر ہے تو پھر نیچے کی طرف گول کیا جائے گا۔ اگر اعشاریہ کے بائیں طرف کا نمبر طاق ہے، تو اسے گول کر دیا جائے گا۔

    2.5 -> setScale(0, ROUND_HALF_EVEN) -> 2

    اعشاریہ کے بائیں طرف نمبر - 2 - برابر ہے۔ راؤنڈنگ نیچے ہوتی ہے۔ چونکہ ہمیں 0 اعشاریہ کی جگہ درکار ہے، نتیجہ 2 ہوگا۔

    3.5 -> setScale(0, ROUND_HALF_EVEN) -> 4

    اعشاریہ کے بائیں طرف نمبر - 3 - طاق ہے۔ راؤنڈنگ اوپر کی طرف ہوتی ہے۔ چونکہ ہمیں 0 اعشاریہ کی جگہ درکار ہے، نتیجہ 4 ہوگا۔

  7. ROUND_UNNECCESSARY- ایسے معاملات میں استعمال کیا جاتا ہے جہاں راؤنڈنگ موڈ کو کسی طریقہ پر منتقل کرنے کی ضرورت ہوتی ہے، لیکن نمبر کو گول کرنے کی ضرورت نہیں ہوتی ہے۔ اگر آپ ROUND_UNNECCESSARY موڈ سیٹ ہونے پر کسی نمبر کو گول کرنے کی کوشش کرتے ہیں، تو ایک ریاضی کا استثناء پھینک دیا جاتا ہے۔

    3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
  8. ROUND_UP--.گراونڈ کرنا n.

    111.5551 -> setScale(3, ROUND_UP) -> 111.556

بڑی تعداد کا موازنہ

یہ سوال بھی اہم ہے۔ آپ کو پہلے ہی یاد ہے کہ یہ طریقہ جاوا میں اشیاء کا موازنہ کرنے کے لیے استعمال ہوتا ہے equals()۔ یہ یا تو خود زبان کے ذریعہ فراہم کیا جاتا ہے (جاوا کی بلٹ ان کلاسوں کی صورت میں) یا پروگرامر کے ذریعہ اوور رائڈ کیا جاتا ہے۔ لیکن کلاس آبجیکٹ کے معاملے میں، موازنہ کے لیے BigDecimalطریقہ استعمال کرنے کی سفارش نہیں کی جاتی ہے۔ equals()اس کی وجہ یہ ہے کہ BigDecimal.equals()دو نمبروں کا طریقہ درست واپس آتا ہے صرف اس صورت میں جب دونوں نمبروں کی قدر اور پیمانہ یکساں ہوںequals() : آئیے y Doubleاور y طریقوں کے رویے کا موازنہ کریں BigDecimal:
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       Double a = 1.5;
       Double b = 1.50;

       System.out.println(a.equals(b));

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.equals(y));

   }
}
کنسول آؤٹ پٹ:

true
false
جیسا کہ آپ دیکھ سکتے ہیں، c کے معاملے میں نمبر 1.5 اور 1.50 BigDecimalغیر مساوی نکلے! equals()یہ بالکل کلاس میں طریقہ کار کی تفصیلات کی وجہ سے ہوا ہے BigDecimal۔ دونوں کے زیادہ درست موازنہ کے لیے، BigDecimalیہ طریقہ استعمال کرنا بہتر ہے compareTo():
import java.math.BigDecimal;

public class Main {

   public static void main(String[] args) {

       BigDecimal x = new BigDecimal("1.5");
       BigDecimal y = new BigDecimal("1.50");

       System.out.println(x.compareTo(y));

   }
}
کنسول آؤٹ پٹ:

0
طریقہ compareTo()0 واپس آیا، جس کا مطلب ہے 1.5 اور 1.50 کے برابر۔ یہ وہ نتیجہ ہے جس پر ہم اعتماد کر رہے تھے! :) یہ آج کے لیے ہمارا سبق ختم کرتا ہے۔ یہ کاموں پر واپس جانے کا وقت ہے! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION