قدیم قسم | میموری میں سائز | اقدار کی حد |
---|---|---|
بائٹ | 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 (جب غیر صفوں میں استعمال ہوتا ہے) | صحیح یا غلط |
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));
یہ ایک اور اہم نکتہ ہے۔ بڑی تعداد میں کلاسیں اپنے آپریشن میں +-*/ آپریٹرز کا استعمال نہیں کرتی ہیں، بلکہ اس کے بجائے طریقوں کا ایک سیٹ فراہم کرتی ہیں۔ آئیے اہم پر ایک نظر ڈالیں (آپ ہمیشہ کی طرح اوریکل دستاویزات میں طریقوں کی مکمل فہرست تلاش کر سکتے ہیں: یہاں اور یہاں )۔
-
ریاضی کی کارروائیوں کو انجام دینے کے طریقے:
add()
,subtract()
,multiply()
,divide()
. بالترتیب اضافے، گھٹاؤ، ضرب اور تقسیم کی کارروائیوں کے لیے استعمال کیا جاتا ہے۔ -
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
-
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
:
-
ROUND_CEILING
--.گراونڈ کرنا n111.5555555555 -> setScale(3, ROUND_CEILING) -> 111.556
-
ROUND_DOWN
--.خارج خارج کرنا n111.5555555555 -> setScale(3, ROUND_DOWN) -> 111.555
-
ROUND_FLOOR
--.نیچے گول کرنا111.5555555555 -> setScale(3, ROUND_FLOOR) -> 111.555
-
ROUND_HALF_UP
اگر اعشاریہ کے بعد نمبر >= .5 ہو تو راؤنڈنگ اپ0.55 -> setScale(1, ROUND_HALF_UP) -> 0.6 0.54 -> setScale(1, ROUND_HALF_UP) -> 0.5
-
ROUND_HALF_DOWN
اگر اعشاریہ کے بعد نمبر > .5 ہو تو راؤنڈنگ اپ0.55 -> setScale(1, ROUND_HALF_DOWN) -> 0.5 0.56 -> setScale(1, ROUND_HALF_DOWN) -> 0.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 ہوگا۔
-
ROUND_UNNECCESSARY
- ایسے معاملات میں استعمال کیا جاتا ہے جہاں راؤنڈنگ موڈ کو کسی طریقہ پر منتقل کرنے کی ضرورت ہوتی ہے، لیکن نمبر کو گول کرنے کی ضرورت نہیں ہوتی ہے۔ اگر آپ ROUND_UNNECCESSARY موڈ سیٹ ہونے پر کسی نمبر کو گول کرنے کی کوشش کرتے ہیں، تو ایک ریاضی کا استثناء پھینک دیا جاتا ہے۔3.51 -> setScale(1, ROUND_UNNECCESSARY) -> ArithmeticException
-
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 کے برابر۔ یہ وہ نتیجہ ہے جس پر ہم اعتماد کر رہے تھے! :) یہ آج کے لیے ہمارا سبق ختم کرتا ہے۔ یہ کاموں پر واپس جانے کا وقت ہے! :)
GO TO FULL VERSION