CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ BigDecimal
John Squirrels
سطح
San Francisco

جاوا ۾ BigDecimal

گروپ ۾ شايع ٿيل
سلام اڄ جي سبق ۾، اسان وڏي انگ بابت ڳالهائينداسين. نه، منهنجو مطلب واقعي وڏو آهي. اسان اڳ ۾ ئي بار بار سامهون آيا آهيون قدر جي حدن جي جدول جي ابتدائي ڊيٽا جي قسمن لاءِ. اهو هن طرح نظر اچي ٿو:
ابتدائي قسم ياداشت ۾ ماپ قدر جي حد
بائيٽ 8 بٽ -128 کان 127 تائين
مختصر 16 بٽ -32768 کان 32767 تائين
چار 16 بٽ 0 کان 65536 تائين
int 32 بٽ -2147483648 کان 2147483647 تائين
ڊگهو 64 بٽ -9223372036854775808 کان 9223372036854775807
فلوٽ 32 بٽ (2 کان پاور آف -149) کان ((2 کان پاور آف -23) * 2 کان پاور 127 تائين)
ٻيڻو 64 بٽ (-2 کان پاور آف 63) کان ((2 کان پاور آف 63) - 1)
بولين 8 (جڏهن arrays ۾ استعمال ڪيو ويو)، 32 (جڏهن صفن ۾ استعمال نه ڪيو ويو) سچ يا ڪوڙ
سڀ کان وڏو ڪمرو انٽيجر ڊيٽا جو قسم ڊگهو آهي . جڏهن اهو سچل-پوائنٽ نمبرن تي اچي ٿو، اهو ڊبل آهي . پر ڇا جيڪڏھن اسان کي گھربل تعداد ايترو وڏو آھي جو اھو ڊگھو به نه ٿو ٿئي ؟ ڊگھي ڊيٽا جي قسم ۾ ممڪن قدرن جي ھڪڙي وڏي حد آھي، پر اھو اڃا تائين 64 بٽ تائين محدود آھي. اسان کي ڇا ڪرڻ جي ضرورت آهي جيڪڏهن اسان جي تمام وڏي نمبر کي 100 بٽس جي ضرورت آهي؟ خوشقسمتيء سان، اسان کي ڪا به شيء ايجاد ڪرڻ جي ضرورت ناهي. اهڙين حالتن لاءِ، جاوا جا ٻه خاص طبقا آهن: BigInteger (انٽيجرز لاءِ) ۽ BigDecimal (سچل پوائنٽ نمبرن لاءِ). ڇا انهن کي خاص بڻائي ٿو؟ سڀ کان پهريان، نظريي ۾، انهن جي وڌ ۾ وڌ سائيز نه آهي. اسان چئون ٿا "نظريي ۾"، ڇاڪاڻ ته لامحدود ياداشت سان ڪو به ڪمپيوٽر ناهي. ۽ جيڪڏھن توھان جو پروگرام ھڪڙو نمبر ٺاھي ٿو موجود ميموري جي مقدار کان وڏو، پوء، پروگرام ڪم نه ڪندو، يقينا. پر اهڙا ڪيس ممڪن ناهن. نتيجي طور، اسان چئي سگھون ٿا ته BigInteger ۽ BigDecimal عملي طور تي لامحدود سائيز جي تعداد جي نمائندگي ڪري سگھن ٿا. اهي طبقا ڇا لاء استعمال ڪيا ويا آهن؟ سڀ کان پهريان، حسابن لاءِ انتهائي سخت درستگي جي گهرج سان. مثال طور، انساني زندگيءَ جو دارومدار ڪجهه پروگرامن ۾ حسابن جي درستگي تي ٿي سگھي ٿو (مثال طور سافٽ ويئر جيڪو ڪنٽرول ڪري ٿو هوائي جهازن، راڪيٽ، يا طبي سامان). تنهن ڪري جيڪڏهن 150 هين ڊيسيمل جڳهه اهم آهي، پوء بگ ڊيسيمل بهترين انتخاب آهي. ان کان سواء، هن طبقي جون شيون اڪثر ڪري فنانس جي دنيا ۾ استعمال ٿيندا آهن، جتي ننڍن قدرن جو صحيح حساب پڻ تمام ضروري آهي. توهان 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);
   }
}
تعمير ڪندڙ کي اسٽرنگ پاس ڪرڻ صرف هڪ ممڪن اختيار آهي. Here we use strings, because our numbers exceed the maximum values ​​fo r lo ng and double , and we do need some way to explain to the compiler which number we want to create :) Simply passing the number 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111 to the constructor won't work ڪوشش ڪندو ته پاس ٿيل نمبر کي ڪنهن هڪ پرائمري ڊيٽا جي قسمن ۾ داخل ڪرڻ جي، پر اهو انهن مان ڪنهن ۾ به نه ٺهندو. ان ڪري گهربل نمبر پاس ڪرڻ لاءِ اسٽرنگ استعمال ڪرڻ سٺو آپشن آهي. ٻئي ڪلاس پاڻمرادو انگن اکرن کي ڪڍي سگھن ٿا پاس ٿيل تارن مان. ياد رکڻ لاءِ هڪ ٻيو اهم نقطو جڏهن وڏي تعداد واري طبقن سان ڪم ڪري رهيو آهي اهو آهي ته انهن جون شيون ناقابل بدلائي ( Imutable ) آهن. توھان اڳي ئي واقف آھيو immutability جي مھرباني توھان جي تجربي جي ڪري String class ۽ wrapper classes for Primitive type (Integer, Long, etc.).
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);

   }
}
ڪنسول آئوٽ:

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 
جيئن توهان توقع ڪندا، اسان جو نمبر تبديل نه ڪيو آهي. اضافي آپريشن کي انجام ڏيڻ لاء، توهان کي آپريشن جو نتيجو حاصل ڪرڻ لاء هڪ نئون اعتراض ٺاهڻ گهرجي.
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);

   }
}
ڪنسول آئوٽ:

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111144444444
ڏسو، ھاڻي سڀ ڪجھ ڪم ڪري ٿو جيئن اھو ھجڻ گھرجي :) رستي ۾، ڇا توھان نوٽيس ڪيو ته اضافي آپريشن ڪيترو غير معمولي نظر اچي ٿو؟
BigInteger result = integer.add(BigInteger.valueOf(33333333));
هي هڪ ٻيو اهم نقطو آهي. وڏا-نمبر ڪلاس استعمال نٿا ڪن + - * / آپريٽرس. ان جي بدران، اهي طريقا مهيا ڪن ٿا. اچو ته واقف ٿيون مکيه سان (هميشه وانگر، توهان ڳولي سگهو ٿا طريقن جي مڪمل فهرست Oracle دستاويزن ۾: هتي ۽ هتي ).
  1. رياضي جي عملن لاءِ طريقا: add() , subtract() , multiply() , divide() . اهي طريقا استعمال ڪيا ويندا آهن اضافي، ذيلي، ضرب ۽ تقسيم ڪرڻ لاء، ترتيب سان.

  2. doubleValue() , intValue() , floatValue() , longValue() , etc. استعمال ڪيا ويندا آھن ھڪڙي وڏي انگ کي جاوا جي ابتدائي قسمن ۾ تبديل ڪرڻ لاءِ. محتاط رھو جڏھن انھن طريقن کي استعمال ڪندي. بٽ سائيز ۾ اختلافن جي باري ۾ نه وساريو!

    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. منٽ () ۽ وڌ ۾ وڌ () توهان کي ٻن وڏن انگن جي گھٽ ۾ گھٽ ۽ وڌ ۾ وڌ قدر ڳولڻ جي اجازت ڏيو.
    نوٽ ڪريو ته اهي طريقا جامد نه آهن!

    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 رويي

هن موضوع جو پنهنجو الڳ سيڪشن آهي، ڇاڪاڻ ته وڏن انگن کي گول ڪرڻ ۽ گول ڪرڻ واري رويي کي ترتيب ڏيڻ ايترو سادو ناهي. توهان استعمال ڪري سگهو ٿا setScale() طريقو هڪ BigDecimal لاءِ decimal هنڌن جو تعداد مقرر ڪرڻ لاءِ . مثال طور، فرض ڪريو ته اسان چاهيون ٿا ته نمبر 111.5555555555 ڊيسيمل پوائنٽ کان پوءِ ٽي عدد هجن. تنهن هوندي، اسان حاصل نٿا ڪري سگھون جيڪو اسان چاهيون ٿا نمبر 3 کي پاس ڪرڻ سان هڪ دليل طور setScale() طريقي سان. جيئن مٿي بيان ڪيو ويو آهي، BigDecimal انگن جي نمائندگي ڪرڻ لاءِ آهي سخت ضرورتن سان گڏ ڪمپيوٽيشنل درستگي تي. ان جي موجوده شڪل ۾، اسان جو نمبر 10 عددن کان پوءِ ڊيسيمل پوائنٽ آهي. اسان انهن مان 7 کي ڇڏڻ چاهيون ٿا ۽ صرف 3 رکڻ چاهيون ٿا. ان جي مطابق، نمبر 3 کان علاوه، اسان کي گولنگ موڊ پاس ڪرڻ گهرجي. BigDecimal وٽ ڪل 8 گولن جا طريقا آھن. اهو تمام گهڻو آهي! پر جيڪڏهن توهان کي پنهنجي حسابن جي درستگي کي درست ڪرڻ جي ضرورت آهي، ته توهان وٽ هر شيءِ توهان کي گهربل هوندي. تنهن ڪري، هتي آهن 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 — گول مٿي ٿئي ٿو جيڪڏھن عدد کان پوءِ جو نمبر >= 0.5

    0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6
    0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
  5. ROUND_HALF_DOWN — گول مٿي ٿئي ٿو جيڪڏھن عدد کان پوءِ جو انگ 0.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() طريقو جاوا ۾ شيون compare آھي. عملدرآمد يا ته ٻولي طرفان مهيا ڪيل آهي (معياري جاوا ڪلاسز لاءِ) يا پروگرامر طرفان اوور رائڊ ڪيو ويو آهي. پر BigDecimal اعتراضن جي صورت ۾ ، استعمال ڪرڻ جي برابر () طريقي جي مقابلي لاء سفارش نه ڪئي وئي آهي. اهو ئي سبب آهي ته BigDecimal.equals() طريقو صحيح موٽائي ٿو صرف ان صورت ۾ جڏهن 2 انگن جو قدر ۽ پيمانو ساڳيو آهي: اچو ته Double ۽ 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
جئين توهان ڏسي سگهو ٿا، BigDecimal لاءِ ، انگ اکر 1.5 ۽ 1.50 غير برابر ٿي ويا! اهو خاص طور تي بگ ڊيسيمل ڪلاس ۾ برابر () طريقي تي عمل درآمد جي وضاحتن جي ڪري هو . ٻن 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