ในช่วงหนึ่งของการพัฒนาเทคโนโลยีคอมพิวเตอร์ เห็นได้ชัดว่าหน่วยประมวลผลกลางจำเป็นต้องมีอุปกรณ์ฮาร์ดแวร์ในการประมวลผลตัวเลขทศนิยม ปัจจุบันสถาปัตยกรรมคอมพิวเตอร์ทั้งหมดสามารถทำงานได้อย่างมีประสิทธิผลกับตัวเลขดังกล่าว แน่นอนว่าในภาษาการเขียนโปรแกรม คุณไม่สามารถทำได้หากไม่มีประเภทข้อมูลที่เกี่ยวข้อง ข้อมูลจุดลอยตัวใน Java มีสองประเภท: float และ double คีย์เวิร์ด Java Floatกำหนดจำนวนจริงที่ใช้พื้นที่ 32 บิตในหน่วยความจำ เราจะพูดถึงตัวเลขดังกล่าวในบทความนี้
ดังนั้น คีย์เวิร์ด Floatหมายถึงตัวเลข ซึ่งเป็นค่าความเที่ยงตรงเดียวที่บรรจุหน่วยความจำขนาด 32 บิตหรือ 4 ไบต์ ในโปรเซสเซอร์บางตัวการทำงานกับตัวเลขดังกล่าวจะเร็วกว่าและดังที่ได้กล่าวไปแล้วว่าจะใช้พื้นที่น้อยกว่าเมื่อเปรียบเทียบกับตัวเลขที่มีความแม่นยำสองเท่า อย่างไรก็ตาม เป็นไปไม่ได้ที่จะพูดด้วยความรวดเร็วอย่างชัดเจน สมมติว่าโปรเซสเซอร์สมัยใหม่บางตัวประมวลผลตัวเลขที่มีความแม่นยำเป็นสองเท่าได้เร็วกว่ามาก
ตัวเลขจุดลอยตัว ตัวเลขจริงถูกเก็บไว้ในคอมพิวเตอร์อย่างไร?
ในการจัดเก็บจำนวนจริงในหน่วยความจำคอมพิวเตอร์ จะมีการจัดสรรบิตจำนวนหนึ่ง จำนวนจริงจะถูกจัดเก็บเป็นเครื่องหมาย (บวกหรือลบ) ตั๊กแตนตำข้าว และเลขชี้กำลัง แมนทิสซาและเลขชี้กำลังคืออะไร สามารถอธิบายได้ดีที่สุดพร้อมตัวอย่าง มวลโดยประมาณของดวงจันทร์คือ 7* 1,022 โดย 7 คือตั๊กแตนตำข้าว ส่วน 22 เป็นเลขชี้กำลัง เมื่อแสดงตัวเลขขนาดใหญ่หรือในทางกลับกัน หรือตัวเลขที่น้อยมากบนหน้าจอ คุณจะเห็นรายการเช่น 7E22 นี่คือจำนวนจุดลอยตัว และ 7 ในที่นี้คือตั๊กแตนตำข้าว และ 22 เป็นเลขยกกำลังหรือกำลังของ 10 สัญกรณ์นี้เรียกว่าสัญกรณ์เลขชี้กำลังคำหลัก Java float และคำหลัก Java Double
ค่าทศนิยม ( ตัวเลขทศนิยมหรือจำนวนจริง) ใน Java แสดงด้วยประเภทfloatและdouble เป็นคำหลักเหล่านี้ที่ใช้ในการจัดเก็บค่าจนถึงเครื่องหมายบางตัวหลังจุดทศนิยม doubleคือตัวเลขที่มีความแม่นยำสองเท่าซึ่งใกล้เคียงกับค่าที่กำหนดหรือได้รับจากการคำนวณมากที่สุด Java Doubleใช้สำหรับการคำนวณทางคณิตศาสตร์ใดๆ (สแควร์รูท, ไซน์, โคไซน์, ..) เช่นเดียวกับการคำนวณทั้งหมดที่ความแม่นยำเป็นสิ่งสำคัญ ชนิดข้อมูล floatใช้สำหรับประเภทจุดลอยตัวที่มีความแม่นยำน้อยกว่า มันถูกใช้งานน้อยมากเพื่อประหยัดหน่วยความจำ ด้านล่างนี้เรามีตารางที่มีข้อมูลหลักเกี่ยวกับ float และ double รวมถึงความแตกต่างลอย | สองเท่า | |
---|---|---|
หลัก | ทศนิยมเป็นค่าความแม่นยำเดียว | มันเป็นค่าที่มีความแม่นยำสองเท่า |
ขนาดเริ่มต้น | 4 ไบต์ (32 บิต) | 8 ไบต์ (64 บิต) |
ค่าเริ่มต้น | 0.0f | 0.0 |
พิสัย | จาก 1.4e–045 ถึง 3.4e+038 | จาก 4.9e–324 เป็น 1.8e+308 |
ใช้เพื่ออะไร | เพื่อประหยัดหน่วยความจำ | เพื่อทำงานกับเศษส่วนได้อย่างแม่นยำ |
Java Float และการประกาศสองครั้ง
คุณสามารถประกาศประเภทdouble ได้หลายแบบ ในลักษณะเดียวกับหมายเลขประเภทอื่นๆ:double myDouble = 2.7;
อย่างไรก็ตาม หากคุณแสดงตัวเลขทศนิยมด้วยวิธีนี้ คอมไพลเลอร์จะต้องให้คุณเปลี่ยนประเภทของตัวเลขให้เป็นสองเท่า นี่เป็นตัวอย่างที่ไม่ถูกต้องของ ตัวแปร float :
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14;
}
}
นี่คือสิ่งที่จะเกิดขึ้นหากคุณเรียกใช้โปรแกรมนี้:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
ความจริงก็คือมันไม่พึงปรารถนาที่จะใช้ตัวเลขลอยตัวและควรทำเพื่อประหยัดหน่วยความจำเท่านั้น เศษส่วนจำนวนจริงทั้งหมดใน Java จะเป็นสองเท่าตามค่าเริ่มต้น และไวยากรณ์ของภาษาก็เน้นย้ำสิ่งนี้ด้วย หากคุณต้องการทำงานกับประเภท float จริงๆ คุณต้องระบุให้ชัดเจนโดยใช้ f ปิดท้ายตัวเลข
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14f;
}
}
อย่างไรก็ตาม ตัวเลขทศนิยมและเลขคู่สามารถเขียนในรูปแบบเลขชี้กำลังได้
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
หากคุณใช้ตัวเลขที่มากพอในการเป็นตัวแทน "ปกติ" Java จะแสดงตัวเลขเหล่านั้นทันทีในรูปแบบเลขชี้กำลัง มาดูตัวอย่างกัน:
public class FloatExample {
public static void main(String[] args) {
//float variables
float myFloatNumber1=2182818284590.45f;
float myFloatNumber2=19822612787260.141592181f;
System.out.println("myFloatNumber1 = " + myFloatNumber1);
System.out.println("myFloatNumber2 = " + myFloatNumber2);
System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
}
}
ผลลัพธ์ของการทำงานของโปรแกรมนี้อยู่ที่นี่:
myFloatNumber1 = 2.1828183E12 myFloatNumber2 = 1.98226121E13 myFloatNumber1 + myFloatNumber2 = 2.1828183E121.98226121E13
ตัวอย่างเลขทศนิยมและเลขคู่แบบพิเศษ
มีตัวเลขทศนิยมพิเศษสามตัวในภาษา Java ซึ่งใช้เพื่อระบุการโอเวอร์โฟลว์และข้อผิดพลาด พวกเขาอยู่ที่นี่:-
ค่าอนันต์เชิงบวกคือผลลัพธ์ของการหารจำนวนบวกด้วย 0 ซึ่งแสดงด้วยค่าคงที่Double.POSITIVE_INFINITYและFloat.POSITIVE_INFINITY
-
ค่าอนันต์เชิงลบคือผลลัพธ์ของการหารจำนวนลบด้วย 0 ซึ่งแสดงด้วยค่า คงที่ Double.NEGATIVE_INFINITYและFloat.NEGATIVE_INFINITY
-
NaN (ไม่ใช่ตัวเลข) แสดงถึงการคำนวณ 0/0 หรือการหารากที่สองของจำนวนลบ แสดงโดยค่าคงที่Double.NaNและFloat.NAN
public class FloatExample {
public static void main(String[] args) {
int myInt = 1;
float zero = 0.0f;
double negZero = -0.0;
double negativeInfinity = Double.NEGATIVE_INFINITY;
double positiveInfinity = Float.POSITIVE_INFINITY;
System.out.println(myInt / zero);
System.out.println(myInt / negZero);
System.out.println(zero == negZero);
System.out.println(negativeInfinity * 0);
System.out.println(positiveInfinity+negativeInfinity);
}
}
ผลลัพธ์คือ:
อินฟินิตี้ -อินฟินิตี้ จริง น่าน น่าน
ความแม่นยำสองเท่าเพียงพอหรือไม่
ในความเป็นจริง แม้ว่าประเภท Doubleจะมีความแม่นยำสองเท่าแต่การใช้ตัวเลขทศนิยมในการคำนวณทางการเงิน ก็ไม่ใช่แนวคิดที่ดีที่สุด เนื่องจากข้อผิดพลาดในการปัดเศษเป็นสิ่งที่ยอมรับไม่ได้ ดังนั้นให้ลองแสดงผลของโปรแกรมต่อไปนี้บนหน้าจอpublic class FloatExample {
public static void main(String[] args) {
System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
}
}
คุณจะได้รับผลลัพธ์ดังต่อไปนี้:
2.0 - 1.1 = 0.8999999999999999
มันสมเหตุสมผลที่จะสรุปว่าผลลัพธ์จะเป็น 0.9 อย่างไรก็ตาม ข้อผิดพลาดดังกล่าวเป็นเรื่องปกติและเกี่ยวข้องกับการแทนตัวเลขไบนารีภายใน ตัวอย่างเช่น เราไม่สามารถแสดงค่าที่แน่นอนของ ⅓ เป็นเศษส่วนทศนิยมได้ แน่นอนว่ามีข้อจำกัดที่คล้ายกันในระบบไบนารี่ หากงานต้องการกำจัดข้อผิดพลาดในการปัดเศษ Java มี คลาส BigDecimalสำหรับสิ่งนี้
GO TO FULL VERSION