JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ BigDecimal

جاوا ۾ BigDecimal

گروپ ۾ شايع ٿيل
سلام! اڄ جي ليڪچر ۾ اسان وڏي انگ بابت ڳالهائينداسين. نه، واقعي وڏين بابت. اڳي ، اسان ڏٺو آهي قدر جي حدن جو جدول پرائمري ڊيٽا جي قسمن لاءِ هڪ کان وڌيڪ ڀيرا. اهو هن طرح نظر اچي ٿو:
ابتدائي قسم ياداشت ۾ ماپ قدرن جي حد
بائيٽ 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 (جڏهن arrays ۾ استعمال ٿيندو آهي)، 32 (جڏهن غير arrays ۾ استعمال ٿيندو آهي) سچ يا ڪوڙ
جيڪڏهن اسان انٽيجرز جي باري ۾ ڳالهائي رهيا آهيون، سڀ کان وڌيڪ گنجائش واري ڊيٽا جو قسم ڊگهو آهي ، ۽ جڏهن اسان سچل پوائنٽ نمبرن جي باري ۾ ڳالهائي رهيا آهيون، ڊبل . پر ڇا جيڪڏھن اسان کي گھربل تعداد ايترو وڏو آھي جو اھو ڊگھو به نٿو ٿئي ؟ ممڪن ڊگھي قدرن جي حد ڪافي وڏي آھي، پر اڃا تائين ھڪڙي خاص سائيز تائين محدود آھي - 64 بٽ. اسان ڇا کڻي سگهون ٿا جيڪڏهن اسان جو تمام وڏو نمبر 100 بٽ وزن آهي؟ خوش قسمت، توهان کي ڪا به شيء ايجاد ڪرڻ جي ضرورت ناهي. جاوا ۾، اهڙين ڪيسن لاءِ ٻه خاص طبقا ٺاهيا ويا - BigInteger (Integers) ۽ 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ڪنهن طرح اسان کي حاصل ڪرڻ جي ضرورت آهي، جيڪو اسان حاصل ڪرڻ چاهيو ٿا 111111111111111111111111111111111111111111111111111111111111111 ڪم نه ڪندو "فٽ" پاس ٿيل نمبر کي ابتدائي ڊيٽا جي ھڪڙي قسم ۾، پر اھو انھن مان ڪنھن ۾ به مناسب نه ٿيندو. تنهن ڪري، گهربل نمبر پاس ڪرڻ لاء اسٽرنگ استعمال ڪرڻ سٺو اختيار آهي. ٻئي ڪلاس پاڻمرادو انگن اکرن کي ڪڍي سگھن ٿا پاس ٿيل اسٽرنگ مان. ياد رکڻ لاءِ هڪ ٻيو اهم نقطو جڏهن وڏي تعداد جي طبقن سان ڪم ڪري رهيو آهي اهو آهي ته انهن جون شيون ناقابل تبديلي ( 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));
هي هڪ ٻيو اهم نقطو آهي. وڏي تعداد ۾ طبقا استعمال نٿا ڪن +-*/ آپريٽرز انهن جي آپريشن ۾، پر ان جي بدران طريقن جو هڪ سيٽ مهيا ڪن ٿا. اچو ته مکيه تي هڪ نظر رکون (توهان، هميشه وانگر، ڳولي سگهو ٿا طريقن جي مڪمل فهرست Oracle دستاويزن ۾: هتي ۽ هتي ).
  1. رياضي جي عملن کي انجام ڏيڻ جا طريقا: add() , subtract(), multiply(), divide(). اضافي، ذيلي، ضرب ۽ ڊويزن جي عملن لاء استعمال ڪيو ويو آهي.

  2. doubleValue(),,,, etc. 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 rounding ڪنٽرول

هي موضوع هڪ الڳ سيڪشن ۾ شامل ڪيو ويو آهي، ڇاڪاڻ ته وڏي انگن کي گول ڪرڻ ۽ ان کي ترتيب ڏيڻ ڪا سادي شيء ناهي. BigDecimalتوھان استعمال ڪري سگھوٿا نمبر لاءِ ڊيسيمل جڳھن جو تعداد مقرر ڪريو setScale(). مثال طور، اسان 111.5555555555 نمبر جي درستگي کي ٽن ڏهاڪن جي جڳهن تي مقرر ڪرڻ چاهيون ٿا. تنهن هوندي، اسان طريقي جي دليل جي طور تي نمبر 3 پاس ڪرڻ جي قابل نه هوندا setScale()۽ اهڙي طرح اسان جو مسئلو حل ڪيو. جيئن مٿي ذڪر ڪيو ويو آهي، BigDecimalاهي انگ اکر آهن حسابن لاءِ وڌايل درستگي سان. ان جي موجوده شڪل ۾، اسان جي تعداد ۾ 10 decimal جايون آهن. اسان انهن مان 7 کي رد ڪرڻ چاهيون ٿا ۽ صرف 3 کي ڇڏڻ چاهيون ٿا. ان ڪري، نمبر 3 کان علاوه، اسان کي گول ڪرڻ واري موڊ کي پيرا ميٽر جي طور تي پاس ڪرڻ گهرجي . مجموعي طور تي 8 گولن جا طريقا آھن BigDecimal. ڪافي سارا! پر جيڪڏهن توهان کي پروگرام ۾ حسابن جي درستگي کي واقعي ٺيڪ ڪرڻ جي ضرورت آهي، ته توهان وٽ ان لاءِ گهربل هر شيءِ هوندي. تنهن ڪري، هتي 8 گولن جا طريقا موجود آهن BigDecimal:
  1. ROUND_CEILING- گول ڪرڻ

    111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
  2. ROUND_DOWN- خارج ٿيڻ

    111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
  3. ROUND_FLOOR- گول ڪرڻ

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

  4. ROUND_HALF_UP- rounding up if the number after decimal point >= .5

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWN- rounding up if the number after decimal point > .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 decimal جڳهن جي ضرورت آهي، نتيجو ٿيندو 2.

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

    اعشاريه پوائنٽ جي کاٻي پاسي وارو انگ - 3 - بي جوڙ آھي. گول مٿي تي ٿيندي آهي. جيئن ته اسان کي 0 decimal جڳهن جي ضرورت آهي، نتيجو 4 ٿيندو.

  7. ROUND_UNNECCESSARY- استعمال ٿيل ڪيسن ۾ جتي گولنگ موڊ کي ڪجهه طريقي سان منتقل ڪرڻ جي ضرورت آهي، پر نمبر کي گول ڪرڻ جي ضرورت ناهي. جيڪڏھن توھان ڪوشش ڪريو ھڪڙي نمبر کي گول ڪرڻ جي جڏھن ROUND_UNNECCESSARY موڊ مقرر ڪيو ويو آھي، ھڪڙو ArithmeticException اڇلايو ويندو.

    3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
  8. ROUND_UP- گول ڪرڻ.

    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
جئين توهان ڏسي سگهو ٿا، نمبر 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