ในภาษาจาวา “NaN” ย่อมาจาก “Not a Number” ไม่ใช่ประเภทของข้อยกเว้น แต่น่าประหลาดใจที่ประเภทข้อมูลของ NaN เป็นตัวเลขด้วย แต่บ่อยครั้งที่โปรแกรมเมอร์มือใหม่ได้รับมันโดยไม่ได้ตั้งใจ พวกเขาก็จะนำไปใช้ในการคำนวณต่อไป ดังนั้น ชนิดข้อมูลที่เข้ากันไม่ได้ใน Java เมื่อใช้ร่วมกันอาจทำให้เกิดข้อผิดพลาดแบบโยนได้ นอกจากนี้ยังเห็นได้ทั่วไปซึ่ง
ตัวอย่างเช่น ดูตัวอย่างข้อมูลต่อไปนี้
java.lang.ArithmeticException: / by zero
ถือว่าเหมือนกับ NaN อย่างไรก็ตาม Java ปฏิบัติต่อทั้งสองต่างกัน งงพอไหม? เพื่อความเข้าใจที่ครอบคลุมของคุณ เราจะแยกความแตกต่างระหว่างสิ่งเหล่านี้ ในตอนท้ายของบทความนี้ คุณจะได้เรียนรู้เกี่ยวกับการดำเนินการที่เป็นไปได้ซึ่งไม่ใช่ตัวเลข (nan) และวิธีการง่ายๆ ในการจัดการ
แนน คืออะไร?
แล้ว NaN คืออะไร? “NaN” อย่างที่หลายๆ คนคาดเดา ใช้แทนคำว่า “Not a Number” ในภาษาจาวา เป็นค่าทศนิยมพิเศษเพื่อแสดงถึงการล้นและข้อผิดพลาด มันถูกสร้างขึ้นเมื่อเลขทศนิยมถูกหารด้วยศูนย์หรือถ้าคำนวณรากที่สองของจำนวนลบ
public class NaN
{
public static void main(String[]args)
{
System.out.println(0.0 / 0.0); //zero divided by zero
System.out.println(Math.sqrt(-1)); //take sqrt of negative number
System.out.println(10.0 % 0); //taking mod by zero
}
}
เอาต์พุต
NaN
NaN
NaN
ในตัวอย่างด้านบน คุณสามารถสังเกตได้ว่า NaN ถูกสร้างขึ้นจากการดำเนินการง่ายๆ 3 อย่าง:
- การหาร
float / double
ศูนย์ด้วยศูนย์ - หารากของจำนวนลบ (Math.sqrt(-x)) ในวิชาคณิตศาสตร์ การหารากที่ สองของจำนวนลบจะได้ผลลัพธ์เป็นจำนวนจินตภาพ กรณีนี้จัดการโดยส่งคืน NaN ใน Java
- การ mod ของตัวเลขที่มีศูนย์จะคืนค่าส่วนที่เหลือหลังจากหารค่าด้วยศูนย์ ดังนั้น NaN จึงถูกส่งกลับ
NaN แตกต่างจากอินฟินิตี้บวกและลบอย่างไร
ตามข้อกำหนดของ IEEE 754 มีค่าทศนิยมและค่าสองเท่าพิเศษสามค่าเพื่อจัดการกับกรณีขอบเขต:- อินฟินิตี้บวก
- อินฟินิตี้เชิงลบ
- น่าน
วิธี isNaN() คืออะไร?
isNaN()
เป็นวิธีการพื้นฐานวิธีหนึ่งใน Java ในการตรวจสอบว่าเป็นค่า NaN หรือไม่ ดังที่เราได้กล่าวถึงสามกรณีข้างต้น ถึงเวลาทดสอบว่าเมธอด isNaN() แยกความแตกต่างระหว่าง ค่า +infinity , -infinityและ NaN อย่างไร
public class isNaN
{ public static void main(String[]args)
{
Double posInfinity = +2.0 / 0.0;
Double negInfinity = -3.5 / 0.0;
Double nanVal = 50 % 0.0;
System.out.println ("+" + posInfinity + ".IsNaN() = " + posInfinity.isNaN());
System.out.println ( negInfinity + ".IsNaN() = " + negInfinity.isNaN());
System.out.println ( nanVal + ".IsNaN() = " + nanVal.isNaN());
}
}
เอาต์พุต
+Infinity.IsNaN() = false
-Infinity.IsNaN() = false
NaN.IsNaN() = true
จะเปรียบเทียบค่า NaN ได้อย่างไร
ทุกค่า NaN ถือว่าแตกต่างกัน ซึ่งหมายความว่า NaN เดียวไม่เท่ากับ NaN อื่น ๆ ตามหลักการนี้ หากคุณเปรียบเทียบค่าหนึ่งกับอีกค่าหนึ่ง ผลลัพธ์จะเป็นค่าลบเสมอ เนื่องจาก NaN ไม่มีการเรียงลำดับ ดังนั้นการเปรียบเทียบตัวเลขที่เกี่ยวข้องกับ NaN เดียวจึงส่งกลับค่าเท็จ Java จัดเตรียม Float.NaN และ Double.NaN สำหรับฟิลด์คงที่ในทั้งสองคลาสเพื่อทำการเปรียบเทียบ เราสามารถแยกความแตกต่างในสองสถานการณ์แยกกัน:- จริง: เฉพาะในกรณีที่ไม่เท่ากัน (!=)
- เท็จ: สำหรับตัวดำเนินการเปรียบเทียบทั้งหมด (==, <=, >=, <, >)
public class ComparingNaN
{ public static void main(String[] args)
{
// Comparing NaN values for Float constants
System.out.println (Float.NaN != Float.NaN); // true
System.out.println (Float.NaN == Float.NaN); // false
System.out.println (Float.NaN < Float.NaN); // false
System.out.println (Float.NaN > Float.NaN); // false
System.out.println (Float.NaN <= Float.NaN); // false
System.out.println (Float.NaN >= Float.NaN); // false
// Comparing NaN values for Float constants
System.out.println (Double.NaN != Double.NaN); // true
System.out.println (Double.NaN == Double.NaN); // false
System.out.println (Double.NaN < Double.NaN); // false
System.out.println (Double.NaN > Double.NaN); // false
System.out.println (Double.NaN <= Double.NaN); // false
System.out.println (Double.NaN >= Double.NaN); // false
}
}
วิธีสร้างค่า NaN
ก่อนสรุป เรามาดูตัวอย่างทั่วไปของการขอ Not a Number (nan)
public class GenerateNaNValues {
static final float ZERO = 0;
public static void main (String[]args)
{
System.out.println("ZERO / ZERO = " + (ZERO / ZERO));
System.out.println("+INFINITY - INFINITY = " +
(Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY));
System.out.println("-INFINITY * ZERO = " + (Float.NEGATIVE_INFINITY * ZERO));
System.out.println("+INFINITY * ZERO = " + (Float.POSITIVE_INFINITY * ZERO));
System.out.println("log10(-10) = " + Math.log(-10));
System.out.println("√-10 = " + Math.sqrt(-10));
System.out.println("NaN + 10 = " + (Float.NaN + 10));
System.out.println("NaN - 10 = " + (Float.NaN - 10));
System.out.println("NaN * 10 = " + (Float.NaN * 10));
System.out.println("NaN / 10 = " + (Float.NaN / 10));
System.out.println("NaN + NaN = " + (Float.NaN + Float.NaN));
System.out.println("NaN - NaN = " + (Float.NaN - Float.NaN));
System.out.println("NaN * NaN = " + (Float.NaN * Float.NaN));
System.out.println("NaN / NaN = " + (Float.NaN / Float.NaN));
}
}
เอาท์พุต:
ZERO / ZERO = NaN
+INFINITY - INFINITY = NaN
-INFINITY * ZERO = NaN
+INFINITY * ZERO = NaN
log10(-10) = NaN
√-10 = NaN
NaN + 10 = NaN
NaN - 10 = NaN
NaN * 10 = NaN
NaN / 10 = NaN
NaN + NaN = NaN
NaN - NaN = NaN
NaN * NaN = NaN
NaN / NaN = NaN
GO TO FULL VERSION