Python ValueError: math domain error - Giải pháp
Trong toán học, có phép toán không hoạt động trên số âm hoặc số 0. Xét căn bậc hai, ví dụ. Bạn không thể tìm căn bậc hai của số âm. Python nhận ra không phải phép toán nào cũng hoạt động với số âm hoặc 0.
Python sẽ ném lỗi khi bạn thử dùng số âm trên phép toán không hỗ trợ. Trong hướng dẫn này, ta nói về nguyên nhân ValueError: math domain error. Cuối hướng dẫn, ta đi qua giải pháp.
ValueError: math domain error
Python ValueError: math domain error được ném ra khi bạn dùng số không được phép bởi phép toán toán học. Lỗi thường ném ra với phương thức sqrt() và log().
ValueError là loại lỗi chỉ ra bạn thực hiện phép toán toán học trên giá trị không hoạt động với phép toán đó. Trong trường hợp "math domain error", ta dùng số âm hoặc 0 nơi không nên dùng.
Hãy đi qua ví dụ ValueError: math domain error thực tế.
Tình huống ví dụ
Ta xây dựng chương trình tính căn bậc hai của số cho trước. Chương trình thiết kế giúp học sinh ôn tập kiến thức căn bậc hai.
Hãy viết chương trình tính căn bậc hai số cho trước. Bắt đầu import thư viện math cần thiết tính căn bậc hai:
import math
Tiếp theo, thu thập số từ người dùng:
number = input("Hãy giải bài toán trước bằng bút giấy. Sau đó, nhập số bạn muốn kiểm tra căn bậc hai: ")
Ta nhắc người dùng thử tìm đáp án tự, vì chương trình thiết kế giúp kiểm tra đáp án. Tiếp theo, tìm căn bậc hai giá trị người dùng nhập:
answer = math.sqrt(int(number))
Ta chuyển giá trị "number" (lưu số người dùng muốn căn bậc hai) thành số nguyên. Cần thiết vì input() (dùng thu thập số) trả về chuỗi. Ta không thể tìm căn bậc hai giá trị chuỗi.
Cuối cùng, in đáp án ra màn hình:
print("Căn bậc hai của {} là {}.".format(number, answer))
Ta dùng format() thêm số vào chuỗi. Chuỗi hiển thị:
"Căn bậc hai của [Số người dùng nhập] là [Căn bậc hai chương trình tính]"
Thử chương trình với số âm:
Hãy giải bài toán trước bằng bút giấy. Sau đó, nhập số bạn muốn kiểm tra căn bậc hai: -16 Traceback (most recent call last): File "test.py", line 5, inanswer = math.sqrt(int(number)) ValueError: math domain error
Ta nhập -16. Mã trả về lỗi.
Hãy sửa lỗi này.
Giải pháp
Để sửa lỗi, ta cần nhắc người dùng không thể tính căn bậc hai số âm trước khi thực thi math.sqrt().
Hãy sửa mã làm điều này:
import math
number = input("Hãy giải bài toán trước bằng bút giấy. Sau đó, nhập số bạn muốn kiểm tra căn bậc hai: ")
if int(number) >= 0:
answer = math.sqrt(int(number))
print("Căn bậc hai của {} là {}.".format(number, answer))
else:
print("Bạn không thể tìm căn bậc hai của số nhỏ hơn 0.")
Ta dùng if kiểm tra số người dùng nhập lớn hơn hoặc bằng 0. Nếu số đáp ứng, nội dung if chạy. Ngược lại, else thực thi, thông báo số không hợp lệ.
Chạy chương trình lại. Kết quả:
Hãy giải bài toán trước bằng bút giấy. Sau đó, nhập số bạn muốn kiểm tra căn bậc hai: -16 Bạn không thể tìm căn bậc hai của số nhỏ hơn 0.
Mã hoạt động thành công.
Kết luận
ValueError: math domain error ném ra khi bạn thực hiện hàm toán học trên số âm hoặc 0 không thể tính. Để sửa lỗi, chắc chắn bạn dùng số hợp lệ cho hàm toán học bạn dùng.
Nếu bạn muốn tìm hiểu thêm lập trình Python, xem hướng dẫn "Cách học Python" của chúng tôi. Hướng dẫn chứa nhiều tài nguyên, khóa học, sách dành cho người học Python.