1. การปัดเศษจำนวนจริง
ดังที่เราได้กล่าวไปแล้ว เมื่อมีการกำหนดจำนวนจริงให้กับint
ตัวแปร มันจะถูกปัดเศษลงเป็นจำนวนเต็มที่น้อยกว่าที่ใกล้ที่สุดเสมอ — ส่วนที่เป็นเศษส่วนนั้นจะถูกปัดทิ้งไป
แต่เป็นเรื่องง่ายที่จะจินตนาการถึงสถานการณ์เมื่อจำนวนเศษส่วนจำเป็นต้องถูกปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุดในทิศทางใดทิศทางหนึ่ง หรือแม้แต่ปัดขึ้น คุณจะทำอย่างไรในกรณีนี้?
สำหรับสิ่งนี้และสำหรับสถานการณ์ที่คล้ายกัน Java มีMath
คลาสซึ่งมีround()
, ceil()
, และfloor()
เมธอด
Math.round()
วิธี
วิธีMath.round()
การปัดตัวเลขให้เป็นจำนวนเต็มที่ใกล้เคียงที่สุด:
long x = Math.round(real_number)
แต่มีความแตกต่างกันเล็กน้อยที่นี่: วิธีนี้ส่งคืนจำนวนเต็มlong
(ไม่ใช่ an int
) เนื่องจากจำนวนจริงอาจมีขนาดใหญ่มาก ผู้สร้าง Java จึงตัดสินใจใช้ประเภทจำนวนเต็มที่ใหญ่ที่สุดที่มีของ Java long
:
ดังนั้น หากโปรแกรมเมอร์ต้องการกำหนดผลลัพธ์ให้กับint
ตัวแปร เธอจะต้องระบุอย่างชัดเจนต่อคอมไพเลอร์ว่าเธอยอมรับการสูญเสียข้อมูลที่เป็นไปได้ (ในกรณีที่ตัวเลขผลลัพธ์ไม่ตรงกับประเภทint
)
int x = (int) Math.round(real_number)
ตัวอย่าง:
คำแถลง | ผลลัพธ์ |
---|---|
|
|
|
|
|
|
Math.ceil()
วิธี
วิธีMath.ceil()
การปัดตัวเลขขึ้นเป็นจำนวนเต็ม นี่คือตัวอย่าง:
คำแถลง | ผลลัพธ์ |
---|---|
|
|
|
|
|
|
Math.floor()
วิธี
วิธีMath.floor()
การปัดตัวเลขลงเป็นจำนวนเต็ม นี่คือตัวอย่าง:
คำแถลง | ผลลัพธ์ |
---|---|
|
|
|
|
|
|
แน่นอน เมื่อปัดเศษตัวเลขเป็นจำนวนเต็ม การใช้ตัวดำเนินการประเภทการโยนจะง่ายกว่า:(int)
คำแถลง | ผลลัพธ์ |
---|---|
|
|
หากคุณจำชื่อเหล่านี้ได้ยาก บทเรียนภาษาอังกฤษสั้นๆ จะช่วยได้:
Math
หมายถึงคณิตศาสตร์Round
แปลว่า รอบCeiling
หมายถึงเพดานFloor
หมายถึงพื้น
2. จำนวนทศนิยมมีโครงสร้างอย่างไร
ประเภท สามารถเก็บ ค่าdouble
ในช่วงจากถึง ช่วงของค่าจำนวนมาก (เมื่อเทียบกับประเภท) อธิบายได้จากข้อเท็จจริงที่ว่าประเภท (รวมถึง) มีโครงสร้างภายในที่แตกต่างอย่างสิ้นเชิงกับประเภทจำนวนเต็ม ภายในประเภทจะเข้ารหัสค่าเป็นตัวเลขสองตัว: ตัวแรกเรียกว่าแมนทิสซาและตัวที่สองเรียกว่าเลขชี้กำลัง-1.7*10308
+1.7*10308
int
double
float
double
สมมติว่าเรามีตัวเลข123456789
และเก็บเป็นdouble
ตัวแปร เมื่อเราทำเช่น นั้นตัวเลขจะถูกแปลงเป็นและภายในประเภทจะเก็บตัวเลขสองตัว — และ เครื่องหมายซิกนิฟิแคนด์ ("ส่วนสำคัญของตัวเลข" หรือแมนทิสซา) จะถูกเน้นด้วยสีแดง ในขณะที่เลขชี้กำลังจะถูกเน้นด้วยสีน้ำเงิน1.23456789*108
double
23456789
8
วิธีการนี้ทำให้สามารถจัดเก็บได้ทั้งตัวเลขที่มากและมีขนาดเล็กมาก แต่เนื่องจากการแสดงตัวเลขจำกัดไว้ที่ 8 ไบต์ (64 บิต )และบางบิตถูกใช้เพื่อเก็บเลขชี้กำลังคือ15 _
นี่เป็น คำอธิบาย ที่ง่าย มาก ว่าจำนวนจริงมีโครงสร้างอย่างไร
3. สูญเสียความแม่นยำเมื่อทำงานกับจำนวนจริง
เมื่อทำงานกับจำนวนจริง โปรดจำไว้เสมอว่าจำนวนจริง ไม่แน่นอน อาจมีข้อผิดพลาดในการปัดเศษและข้อผิดพลาดในการแปลง เสมอ เมื่อแปลงจากเลขฐานสิบเป็นเลขฐานสอง นอกจากนี้ ข้อผิดพลาดที่พบได้บ่อยที่สุดคือการสูญเสียความแม่นยำเมื่อบวก/ลบตัวเลขในมาตราส่วนที่แตกต่างกันอย่างสิ้นเชิง
ข้อเท็จจริงสุดท้ายนี้เป็นเรื่องที่น่าเหลือเชื่อสำหรับโปรแกรมเมอร์มือใหม่
ถ้าเราลบออกจากเราจะได้1/109
109
109
การลบตัวเลขในระดับที่แตกต่างกันอย่างสิ้นเชิง | คำอธิบาย |
---|---|
|
จำนวนที่สองมีขนาดเล็กมากซึ่งจะทำให้ไม่มีนัยสำคัญ (เน้นด้วยสีเทา) ตัวเลขนัยสำคัญ 15 หลักจะถูกเน้นด้วยสีส้ม |
เราสามารถพูดอะไรได้บ้าง การเขียนโปรแกรมไม่เหมือนกับคณิตศาสตร์
4. ข้อผิดพลาดเมื่อเปรียบเทียบจำนวนจริง
อันตรายอีกประการหนึ่งคือการรอโปรแกรมเมอร์เมื่อพวกเขาเปรียบเทียบจำนวนจริง เกิดขึ้นเมื่อทำงานกับจำนวนจริง เนื่องจากข้อผิดพลาดในการปัดเศษสามารถสะสมได้ ผลลัพธ์คือมีบางสถานการณ์ที่คาดว่าจำนวนจริงจะเท่ากัน แต่ก็ไม่เป็นเช่นนั้น หรือกลับกัน: คาดว่าตัวเลขจะต่างกัน แต่ก็เท่ากัน
ตัวอย่าง:
คำแถลง | คำอธิบาย |
---|---|
|
ค่าของตัวแปรa จะเป็น1000000000.0 ค่าของตัวแปร c จะเป็น1000000000.0 (ตัวเลขใน b ตัวแปรน้อยเกินไป) |
ในตัวอย่างข้างต้นa
และc
ไม่ควรเท่ากัน แต่จะมี
หรือลองมาอีกตัวอย่างหนึ่ง:
คำแถลง | คำอธิบาย |
---|---|
|
ค่าของตัวแปรa จะเป็น1.0 ค่าของตัวแปร b จะเป็น1.0 |
5. ข้อเท็จจริงที่น่าสนใจเกี่ยวกับstrictfp
Java มีstrictfp
คีย์เวิร์ดพิเศษ ( เข้มงวด f loating p oint ) ซึ่งไม่พบในภาษาโปรแกรมอื่น และคุณรู้หรือไม่ว่าทำไมคุณถึงต้องการมัน? มันทำให้ความแม่นยำของการดำเนินการแย่ลงด้วยตัวเลขทศนิยม นี่คือเรื่องราวของความเป็นมา:
GO TO FULL VERSION