Python ValueError: math domain error - สาเหตุและวิธีแก้ไข
ในคณิตศาสตร์ มีการดำเนินการที่ไม่ทำงานกับตัวเลขลบหรือศูนย์ ตัวอย่างเช่น รากที่สอง (square root) คุณไม่สามารถหารากที่สองของตัวเลขลบได้ Python สังเกตเห็นว่าไม่ใช่ทุกการดำเนินการที่ทำงานกับตัวเลขลบหรือศูนย์
Python จะยกข้อผิดพลาดเมื่อคุณพยายามใช้ตัวเลขลบในการดำเนินการที่ไม่รองรับ ในคู่มือนี้ เราจะพูดถึงสาเหตุของ ValueError: math domain error ไปจนถึงท้ายคู่มือ เราจะเดินทางผ่านวิธีแก้ไขปัญหานี้
ValueError: math domain error
Python ValueError: math domain error ถูกยกขึ้นเมื่อคุณใช้ตัวเลขที่ไม่ได้รับการรองรับโดยการดำเนินการทางคณิตศาสตร์ ข้อผิดพลาดนี้มักถูกยกขึ้นกับเมธอด sqrt() และ log()
ValueError เป็นชนิดข้อผิดพลาดที่บ่งชี้ว่าคุณกำลังดำเนินการทางคณิตศาสตร์บนค่าที่ไม่ทำงานกับการดำเนินการนั้น ในกรณี "math domain error" เราใช้ตัวเลขลบหรือศูนย์ที่ไม่ควรใช้
มาเดินทางผ่านตัวอย่างปัญหา ValueError: math domain error ในการทำงาน
สถานการณ์ตัวอย่าง
เรากำลังสร้างโปรแกรมคำนวณรากที่สองของตัวเลขที่กำหนด โปรแกรมนี้ออกแบบมาเพื่อช่วยนักเรียบทบทวนความรู้เรื่องรากที่สอง
มาเขียนโปรแกรมคำนวณรากที่สองของตัวเลขที่กำหนด เริ่มต้นด้วยการนำเข้าไลบรารี math ที่ต้องการคำนวณรากที่สอง:
import math
ต่อไป เราจะรับตัวเลขจากผู้ใช้:
number = input("Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: ")
เราแจ้งให้ผู้ใช้ลองหาคำตอบเองก่อน เนื่องจากโปรแกรมออกแบบมาเพื่อช่วยตรวจสอบคำตอบ ต่อไป เราจะหารากที่สองของค่าที่ผู้ใช้ป้อน:
answer = math.sqrt(int(number))
เราแปลงค่า number ซึ่งเก็บตัวเลขที่ผู้ใช้ต้องการหาราก ที่สอง เป็นจำนวนเต็ม (integer) จำเป็นเพราะเมธอด input() ที่เราใช้รับตัวเลข คืนค่าสตริง เราไม่สามารถหารากที่สองของค่าสตริงได้
สุดท้าย มาพิมพ์คำตอบไปคอนโซล:
print("The square root of {} is {}.".format(number, answer))
เราใช้คำสั่ง format() เพิ่มตัวเลขเข้าไปในสตริง สตริงของเราจะแสดง:
"The square root of [Number user inserted] is [The square root our program calculated]"
มาทดสอบโปรแกรมด้วยตัวเลขลบ:
Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: -16 Traceback (most recent call last): File "test.py", line 5, inanswer = math.sqrt(int(number)) ValueError: math domain error
เราใส่ค่า -16 เข้าโปรแกรม โค้ดคืนข้อผิดพลาด
มาแก้ไขข้อผิดพลาดนี้
วิธีแก้ไข (The Solution)
เพื่อแก้ไขข้อผิดพลาดนี้ เราต้องแจ้งเตือนผู้ใช้ว่าคุณไม่สามารถหารากที่สองของตัวเลขลบได้ ก่อนที่เราจะรันฟังก์ชัน math.sqrt()
มาปรับโค้ดให้ทำได้:
import math
number = input("Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: ")
if int(number) >= 0:
answer = math.sqrt(int(number))
print("The square root of {} is {}.".format(number, answer))
else:
print("You cannot find the square root of a number less than 0.")
เราใช้คำสั่ง if ตรวจสอบว่าตัวเลขที่ผู้ใช้ป้อนเท่ากับหรือมากกว่าศูนย์ หากตัวเลขตรงเกณฑ์ เนื้อหา if จะรัน มิฉะนั้น คำสั่ง else จะรัน แสดงข้อความว่าเราใส่ตัวเลขไม่ถูกต้อง
มารันโปรแกรมอีกครั้ง โปรแกรมคืนค่า:
Try solving the problem first using pencil and paper. Then, insert the number whose square root you want to verify: -16 You cannot find the square root of a number less than 0.
โค้ดของเราทำงานสำเร็จ
สรุป
ValueError: math domain error ถูกยกขึ้นเมื่อคุณดำเนินการฟังก์ชันทางคณิตศาสตร์บนตัวเลขลบหรือศูนย์ที่ไม่สามารถคำนวณได้ เพื่อแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณใช้ตัวเลขที่ถูกต้องสำหรับฟังก์ชันทางคณิตศาสตร์ที่ใช้
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโค้ด Python ดูคู่มือ How to Learn Python ของเรา คู่มือนี้มีแหล่งทรัพยากรการเรียนรู้ คอร์ส และหนังสือ สำหรับคนเรียนภาษาโปรแกรมมิ่ง Python