ใน Java แอปพลิเคชันประกอบด้วยคลาส และคลาสประกอบด้วยเมธอดและตัวแปร ตัวแปรจะถูกแบ่งออกเป็นแบบดั้งเดิมและการอ้างอิง มีตัวแปร 8 ประเภทใน Java และไม่รวม
boolean
และchar
แบ่งออกเป็นประเภทต่อไปนี้:
- จำนวนเต็ม:
byte
,short
,int
และlong
; - จุดลอยตัว (เรียกอีกอย่างว่าจำนวนจริง):
float
และdouble
.
long
โดยมีช่วงตั้งแต่ -9223372036854775808 ถึง 9223372036854775807 ของจำนวนจุดลอยตัวdouble
มีช่วง 1.7e-308 ถึง 1.7e+308 คุณสามารถอ่านเพิ่มเติมเกี่ยวกับจำนวนจริง ได้ในบทความนี้ แต่ถ้าเราจำเป็นต้องเก็บตัวเลขที่มากกว่าช่วงที่ยอมรับได้ล่ะ? ในกรณีนี้เราจะต้องBigInteger
และBigDecimal
.
BigInteger ในชวา
คลาส JavaBigInteger
ถูกใช้เป็นอะนาล็อกกับค่าจำนวนเต็มที่มีความยาวตามอำเภอใจซึ่งไม่มีขีดจำกัดความยาว 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
และ1
10
วิธี 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
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
และ นี่คือลิงค์ไปยังเอกสารประกอบ และสุดท้าย: อย่างที่คุณคงสังเกตเห็น เมื่อดำเนินการกับวัตถุและเราไม่ได้เปลี่ยนอันเก่า แต่จะได้อันใหม่เสมอ สิ่งนี้บอกเราว่าพวกเขาคือไม่สามารถเปลี่ยนแปลงได้หลังจากการสร้างของพวกเขา เช่นเดียวกับ กล่าวอีกนัยหนึ่ง วิธีการทั้งหมดไม่สามารถเปลี่ยนสถานะภายในของวัตถุได้ อย่างมาก พวกเขาสามารถส่งคืนวัตถุใหม่ด้วยพารามิเตอร์ที่ระบุโดยฟังก์ชันที่เราใช้อยู่ ONE
TEN
BigInteger
BigDecimal
immutable
String
GO TO FULL VERSION