JavaRush /จาวาบล็อก /Random-TH /BigInteger และ BigDecimal

BigInteger และ BigDecimal

เผยแพร่ในกลุ่ม
ใน Java แอปพลิเคชันประกอบด้วยคลาส และคลาสประกอบด้วยเมธอดและตัวแปร ตัวแปรจะถูกแบ่งออกเป็นแบบดั้งเดิมและการอ้างอิง BigInteger และ BigDecimal - 1มีตัวแปร 8 ประเภทใน Java และไม่รวมbooleanและcharแบ่งออกเป็นประเภทต่อไปนี้:
  • จำนวนเต็ม: byte, short, intและlong;
  • จุดลอยตัว (เรียกอีกอย่างว่าจำนวนจริง): floatและdouble.
ภายในกลุ่มเล็ก ๆ เหล่านี้ ความแตกต่างมีอยู่เฉพาะในช่วงของค่าที่สามารถมีอยู่ได้ (และด้วยเหตุนี้ พื้นที่ว่างของตัวแปรดังกล่าวจึงแตกต่างกันไป) ประเภทจำนวนเต็มที่ใหญ่ที่สุดคือlongโดยมีช่วงตั้งแต่ -9223372036854775808 ถึง 9223372036854775807 ของจำนวนจุดลอยตัวdoubleมีช่วง 1.7e-308 ถึง 1.7e+308 คุณสามารถอ่านเพิ่มเติมเกี่ยวกับจำนวนจริง ได้ในบทความนี้ แต่ถ้าเราจำเป็นต้องเก็บตัวเลขที่มากกว่าช่วงที่ยอมรับได้ล่ะ? ในกรณีนี้เราจะต้องBigIntegerและBigDecimal.

BigInteger ในชวา

คลาส Java BigIntegerถูกใช้เป็นอะนาล็อกกับค่าจำนวนเต็มที่มีความยาวตามอำเภอใจซึ่งไม่มีขีดจำกัดความยาว 64 บิต ยิ่งไปกว่านั้น มันเป็นลูกหลานของคลาสNumberเช่นเดียวกับ wrapper มาตรฐานสำหรับประเภทเชิงตัวเลขอย่างง่าย - Integer, Long, Byte, Doubleและอื่น ๆ ดังนั้นจึงมีการใช้วิธีการที่นำไปสู่ประเภทอย่างง่าย:
BigInteger value = new BigInteger("32145");

int intValue = value.intValue();//32145

long longValue = value.longValue();//32145

double doubleValue = value.doubleValue();//32145.0
ทันทีที่เราเห็นการสร้างวัตถุดังกล่าวBigIntegerโดยที่ค่าของเราถูกส่งไปยังตัวสร้าง แต่อยู่ในรูปแบบสตริง เป็นที่น่าสังเกตว่าเขามีนักออกแบบมากกว่าหนึ่งคน แต่สำหรับทุกโอกาส หากประเภทดั้งเดิมไม่รองรับข้อมูลทั้งหมดจากBigIntegerข้อมูลจะถูกตัดให้เหลืออยู่ในช่วงของประเภทดั้งเดิมนั้น แต่ในขณะเดียวกันก็มีวิธีการเหล่านี้ที่คล้ายคลึงกัน ( intValueExact()ฯลฯlongValueExact()) โดยมีข้อแตกต่างเพียงอย่างเดียวคือหากประเภทธรรมดาที่เกิดการแปลงไม่รองรับช่วงข้อมูลArithmeticException จะถูกส่งออก ไป

ค่าคงที่ BigInteger

สำหรับการใช้งานภายใน คลาสมีค่าคงที่:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
สิ่ง เหล่า นี้ คือวัตถุคงที่BigIntegerที่มีค่า ตามลำดับ0และ110

วิธี BigInteger

หนึ่งในคุณสมบัติหลักของคลาสนี้คือมันเต็มไปด้วยวิธีการที่ใช้การดำเนินการทางคณิตศาสตร์มาตรฐานใน Java ตัวอย่างเช่น:
  • การดำเนินการสรุป:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • การดำเนินการคูณ:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • การดำเนินการหาเศษเมื่อหารจำนวนหนึ่งด้วยอีกจำนวนหนึ่ง:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • รับค่าสัมบูรณ์ของตัวเลข (นั่นคือ โมดูโล ไม่ได้ลงนาม):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
นอกจากนี้ยังมีวิธีการสำหรับการดำเนินการที่ซับซ้อน (เฉพาะ) มากขึ้น:
  • การดำเนินการด้วย การคำนวณ mod :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
ฟังก์ชันนี้มีหลายรูปแบบ:
  • รับตัวเลขสุ่มและระบุจำนวนบิตที่ค่าผลลัพธ์จะใช้:

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • การดำเนินการกะระดับบิต (นี่ >> n)

    เลื่อนไปทางซ้าย:

    BigInteger firstValue = new BigInteger("5");
    BigInteger firstResultValue = firstValue.shiftLeft(3);//40

    เลื่อนไปทางขวา:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
แน่นอนว่า เป็นการดีกว่าถ้าดูรายการวิธีการทั้งหมดในเอกสารประกอบ BigInteger และ BigDecimal - 2

BigDecimal ใน Java

เมื่อเราต้องการความยาวตามจำนวนจริง คลาส Java จะถูกใช้BigDecimal- ตามกฎแล้ว ใช้เพื่อทำงานกับการเงินแทนdoubleเนื่องจากมีตัวเลือกการปรับแต่งเพิ่มเติม Like และBigIntegerเป็นBigDecimalลูกหลานของคลาสNumberและมีวิธีการที่ส่งคืนค่าของวัตถุเป็นประเภทดั้งเดิมเฉพาะ:
BigDecimal value = new BigDecimal(35563.3);

long longValue = value.longValue();//35563

double doubleValue = value.doubleValue();//35563.3
ดังที่เราเห็นเมื่อลดเหลือ เหลือlongเพียงส่วนจำนวนเต็มและตำแหน่งทศนิยมจะถูกละทิ้ง

ตัวสร้าง BigDecimal

เราจะมาดู ตัวสร้าง ให้ละเอียดยิ่งขึ้น BigDecimalเนื่องจากคลาสมีตัวเลือกที่กว้างกว่ามาก มีตัวสร้างที่อนุญาตให้คุณตั้งค่าของวัตถุในรูปแบบที่แตกต่างกัน (โดยการส่งผ่านint, long, doubleและStringแม้แต่BigInteger) และก็มีบางตัวที่อนุญาต กำหนดการตั้งค่าของวัตถุที่สร้างขึ้น (วิธีการปัดเศษ, จำนวนตำแหน่งทศนิยม):
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
ทุกอย่างชัดเจนที่นี่เราตั้งค่าและจำนวนตำแหน่งทศนิยมที่เราต้องการดูโดยตรง
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
ผลลัพธ์ของ Constructor นี้ค่อนข้างคาดเดาไม่ได้ เนื่องจากเรากำลังระบุ double ซึ่งโดยธรรมชาติแล้วจะเป็นประเภทที่คลุมเครือมาก ดังนั้นจึงแนะนำให้ใช้ในตัวสร้างโดยStringทั่วไป
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
เราตั้งค่าdoubleแต่ในขณะเดียวกัน เรายังตั้งค่าพารามิเตอร์ที่อธิบายกฎการปัดเศษด้วย (ซึ่งมีจำนวนตำแหน่งทศนิยมและอัลกอริทึมสำหรับการปัดเศษ)
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
เราตั้งค่าอาร์เรย์ของอักขระจากองค์ประกอบที่เราใช้ค่าสำหรับวัตถุและจำนวนองค์ประกอบเหล่านี้ที่เราใช้
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
เราใช้วัตถุที่มีอยู่แล้วBigIntegerกำหนดจำนวนตำแหน่งทศนิยม

วิธีการทศนิยมขนาดใหญ่

คลาสนี้BigDecimalยังมีวิธีการสำหรับการดำเนินการทางคณิตศาสตร์ต่างๆ แต่BigIntegerไม่มีวิธีการทำงานกับบิต เช่น แต่อย่างไรก็ตาม คุณสมบัติหลักBigDecimalคือความยืดหยุ่นในการทำงานกับตัวเลขทศนิยม มาดูเทคนิคบางอย่างที่ให้พลังเราในการเรียนรู้จำนวนจริง:
  • เราได้ความแม่นยำ (จำนวนตัวเลข):

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • กำหนดจำนวนตำแหน่งทศนิยมและกฎการปัดเศษ:

    BigDecimal firstValue = new BigDecimal(3445.544445);
    
    BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545

    ด้านล่างนี้เราจะมาดูค่าคงที่สำหรับการตั้งค่ากฎการปัดเศษอย่างละเอียดยิ่งขึ้น

  • หารBigDecimalด้วยอีกBigDecimalในขณะที่ระบุจำนวนตำแหน่งทศนิยมที่ต้องการและกฎการปัดเศษ:

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • การย้ายจุดทศนิยมไปทางขวา/ซ้ายตามจำนวนตำแหน่งที่กำหนด:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • ตัดศูนย์ต่อท้าย:

    BigDecimal value = new BigDecimal("45056.5000");
    BigDecimal result = value.stripTrailingZeros();//45056.5

    หากเรามีศูนย์ทั้งหมดในส่วนจริงและยังมีศูนย์ในส่วนทั้งหมดด้วย (หรือเราไม่มีทศนิยมเลย) ดังนั้น:

    BigDecimal value = new BigDecimal("450000.000");
    BigDecimal result = value.stripTrailingZeros();//4.5E+5

กฎการปัดเศษทศนิยมใหญ่

ในการกำหนดกฎการปัดเศษ ภายในBigDecimalเราจะเห็นค่าคงที่พิเศษที่อธิบายอัลกอริทึมการปัดเศษ: ROUND_UP- การปัดเศษจากศูนย์ การปัดเศษไปทางส่วนจริง:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_UP );//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UP );//-2.5
ROUND_DOWN— การปัดเศษเป็นศูนย์ นั่นคือ การตัดทอนส่วนจริง:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_DOWN  );//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_DOWN  );//-2.6
ROUND_CEILING- การปัดเศษเป็นค่าอนันต์บวก นั่นคือถ้าจำนวนของเราเป็นบวก -> ROUND_UPถ้าเป็นลบก็จะ ->ROUND_DOWN
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_CEILING);//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_CEILING);//-2.5
ROUND_FLOOR- ปัดเศษเป็นลบอนันต์ นั่นคือถ้าจำนวนของเราเป็นบวก จากนั้น -> ROUND_DOWNถ้าเป็นลบ ก็จะ ->ROUND_UP
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_FLOOR);//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_FLOOR);//-2.6
สำหรับค่าที่อยู่ระหว่างการพิจารณา เราจะพิจารณาจำนวนที่ใกล้ที่สุดโดยมีจุดทศนิยมที่ถูกตัดทอนเป็นเพื่อนบ้านที่ใกล้ที่สุดของตัวเลขที่กำลังพิจารณา ตัวอย่างเช่น 2.43 จะใกล้กับ 2.4 มากกว่า 2.5 แต่ 2.48 จะใกล้กับ 2.5 ROUND_HALF_DOWN— ปัดเศษเป็น “เพื่อนบ้านที่ใกล้ที่สุด” หากเพื่อนบ้านทั้งสองมีระยะห่างเท่ากันจากค่าใดค่าหนึ่ง ระบบจะทำการปัดเศษเป็นศูนย์ ระยะทางเท่ากันคือ เมื่อตัวเลขที่ถูกปัดเศษคือ 5 และเป็นระยะทางเท่ากันจาก 0 และ 10):
BigDecimal firstValue = new BigDecimal("2.58");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.6
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.5
ROUND_HALF_UP— โหมดปัดเศษไปทาง “เพื่อนบ้านที่ใกล้ที่สุด” หากเพื่อนบ้านทั้งสองมีระยะห่างเท่ากัน ให้ปัดเศษขึ้น (นี่เป็นการปัดเศษเดียวกันกับที่เราสอนในโรงเรียน):
BigDecimal firstValue = new BigDecimal("2.53");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.5
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.6
ROUND_HALF_EVEN— ปัดเศษเป็น “เพื่อนบ้านที่ใกล้ที่สุด” หากเพื่อนบ้านทั้งสองมีระยะห่างไม่เท่ากัน ในกรณีนี้ หากจำนวนที่ถูกปัดเศษขึ้นหน้าด้วยเลขคี่ จะถูกปัดเศษขึ้น และหากเป็นจำนวนคู่ จะถูกปัดเศษลง:
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
เราได้ผลลัพธ์นี้เพราะเมื่อปัดเศษ 5 จะดูที่ 2 ก่อนหน้าแล้วเห็นว่าเป็นเลขคู่จึงปัดลง แต่ถ้า:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
การปัดเศษนั้นเพิ่มขึ้น เนื่องจาก 5 รายการสุดท้ายดูที่ค่าก่อนหน้าและเห็นเลขคี่ เป็นผลให้ตัวเลขถูกปัดเศษขึ้นเป็น 6 หลังจากนั้น 6 ถัดไปก็ถูกปัดเศษด้วย แต่ทั้งหกไม่ดูเลขทางซ้ายอีกต่อไปเนื่องจากเลขนั้นอยู่ใกล้ขึ้นอย่างเห็นได้ชัดและส่งผลให้เลข 2 ตัวสุดท้ายเพิ่มขึ้น 1 ROUND_UNNECESSARY- ใช้ตรวจสอบว่าตัวเลขไม่ต้องปัดเศษ นั่นคือเราตรวจสอบว่าตัวเลขนั้นมีจำนวนตำแหน่งทศนิยมตามที่ต้องการ:
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
ทุกอย่างเรียบร้อยดีที่นี่ ค่ามีสองหลัก และเราตรวจสอบว่ามีเพียงสองหลักหลังจุดทศนิยม แต่ถ้า:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
จากนั้นเราจะได้รับ - ArithmeticExceptionเนื่องจากค่าที่กำลังทดสอบเกินจำนวนตำแหน่งทศนิยมที่ระบุ แต่ถ้าเราตรวจสอบทศนิยมสองตำแหน่ง แต่อันที่จริงมีตำแหน่งหนึ่งอยู่ที่นั่น ข้อยกเว้นจะไม่ถูกโยนทิ้ง และตัวเลขที่หายไปจะเสริมด้วยศูนย์:
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
ฉันอยากจะทราบด้วยว่า y มี ค่า คงBigDecimalที่คล้ายกับค่าคงที่BigInteger ZEROและ นี่คือลิงค์ไปยังเอกสารประกอบ และสุดท้าย: อย่างที่คุณคงสังเกตเห็น เมื่อดำเนินการกับวัตถุและเราไม่ได้เปลี่ยนอันเก่า แต่จะได้อันใหม่เสมอ สิ่งนี้บอกเราว่าพวกเขาคือไม่สามารถเปลี่ยนแปลงได้หลังจากการสร้างของพวกเขา เช่นเดียวกับ กล่าวอีกนัยหนึ่ง วิธีการทั้งหมดไม่สามารถเปลี่ยนสถานะภายในของวัตถุได้ อย่างมาก พวกเขาสามารถส่งคืนวัตถุใหม่ด้วยพารามิเตอร์ที่ระบุโดยฟังก์ชันที่เราใช้อยู่ ONETENBigIntegerBigDecimalimmutableString
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION