[Java] NaN คือ อะไร

บ่อยครั้งที่เราเขียนโปรแกรมที่เกี่ยวกับการคำนวณตัวเลขต่างๆ ไปๆมาๆ เกิด Exception ตัวอย่าง เช่น

Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN at java.math.BigDecimal.(Unknown Source)

สาเหตุของปัญหานี้ คือ การคำนวณแล้วเกิด NaN ซึ่งเป็น NumberFormatException อยากรู้ว่าน้อง NaN คือ อะไร สามารถอ่านต่อได้เลยครับ

NaN คือ อะไร

  • NaN ย่อมาจาก not a number แปลตรงตัวเลย คือว่า มันไม่เป็นตัวเลข

การเกิดNaN มักจะเกิดจากอะไร

  • ใช้ค่าที่ไม่เหมาะสมกับ method หรือ ตามหลักการที่ควรจะเป็น เช่น root ไม่ควรติดลบ
  • อาจจะเกิดจากการ overflow ขึ้นของชนิดข้อมูลนั้นๆ
  • การจัดเก็บข้อมูลที่เพี้ยนไปในรูปแบบ IEEE Standard for Floating-Point Arithmetic (IEEE 754) ของพวกกลุ่มทศนิยม float ,double เช่น 0.00 ในคอมอาจะเก็บเป็น 0.00000000000000000000000000001 ทำให้ค่าที่ได้ มีค่าไม่เท่ากับ 0

การแก้ไข

  • ใช้ method isNaN ซึ่งเป็น Method ที่อยู่ใ DataType ชนิดตัวเลขอยู่แล้ว เช่น Float, Double, BigDecimal เป็นต้น โดยมีการคืนค่ากลับมาในรูปของ boolean (true, false)
  • วิธีใช้ให้ดูจาก code ด้านล่างนี้ จากนั้นก็สร้าง Exception ขึ้นมาในการจัดการข้อผิดพลาดนี้ โดยถ้าพบว่า ผลการคำนวณเป็น NaN ให้โปรแกรม throw Exception เพื่อไปจัดการในส่วนของ Catch ในการแสดง Message บอกใช้ผู้ใช้งานรู้
public static void main(String[] args) {
	......
	try{
		......
		x1 = ((-b)+root)/down;
		//ใช้ method isNaN ในการตรวจสอบค่าของ x1 ซึ่งมีชนิดข้อมูลแบบ Double ว่าเกิด NaN หรือไม่
		if(Double.isNaN(x1)){
			throw new ArithmeticException();
			//ถ้าใช่ก็จะสร้าง ArithmeticException() แล้วโยนไปให้ส่วน catch จัดการ
		}
	}catch(ArithmeticException e){
		JOptionPane.showMessageDialog(null,"ArithmeticException: "+e.getMessage());
	}catch(NumberFormatException e){
		JOptionPane.showMessageDialog(null,"NumberFormatException: "+e.getMessage());
	}catch(Exception e){
		JOptionPane.showMessageDialog(null,"Error: "+e.getMessage());
	}
}

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.