Tôi có mã để tính chênh lệch tỷ lệ phần trăm giữa 2 số - (oldNum - newNum)/oldNum * 100;
- trong đó cả hai số là double
s. Tôi dự kiến sẽ phải thêm một số loại kiểm tra/xử lý ngoại lệ trong trường hợp oldNum là 0. Tuy nhiên, khi tôi chạy thử nghiệm với các giá trị 0.0 cho cả oldNum và newNum, thực thi tiếp tục như thể không có gì xảy ra và không có lỗi nào bị ném. Chạy mã này với int
s chắc chắn sẽ gây ra một ngoại lệ số học-by-zero. Tại sao Java bỏ qua nó khi nói đến double
s?Tại sao Java không ném ngoại lệ khi chia cho 0.0?
Trả lời
Kết quả của phép chia cho không, nói về mặt toán học, không xác định, có thể được thể hiện với một phao/đôi (như NaN
- không phải là một số), nó là không, tuy nhiên, sai trong bất kỳ ý nghĩa cơ bản.
Là số nguyên phải giữ giá trị bằng số cụ thể, lỗi phải được chia thành số không khi xử lý chúng.
Chính xác. Điều này được định nghĩa trong Java Language Spec ở đây: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 –
Tôi đã thử xuất kết quả, và nó là một giá trị NaN. Điều đó có nghĩa là int không thể giữ NaN? – froadie
nhưng đây là trường hợp của '0.0/0.0' là NaN. –
Cách một đôi được lưu trữ hoàn toàn khác với int. Xem http://firstclassthoughts.co.uk/java/traps/java_double_traps.html để có giải thích chi tiết hơn về cách Java xử lý các phép tính kép. Bạn cũng nên đọc các số Floating Point, đặc biệt là khái niệm về Not a Number (NaN).
Nếu bạn quan tâm đến việc tìm hiểu thêm về đại diện điểm nổi, tôi khuyên bạn nên đọc this document (Định dạng Word, xin lỗi). Nó đào sâu vào biểu diễn nhị phân của các số, có thể hữu ích cho sự hiểu biết của bạn.
Java float
và double
loại, giống như khá nhiều bất kỳ ngôn ngữ nào khác ngoài kia (và khá nhiều bất kỳ đơn vị FP phần cứng), thực hiện các tiêu chuẩn IEEE 754 cho nổi toán điểm, mà ủy nhiệm phép chia cho không trở về một "vô cực" giá trị đặc biệt . Ném một ngoại lệ sẽ thực sự vi phạm tiêu chuẩn đó.
Số nguyên nguyên (được thực hiện dưới dạng Java và hầu hết các ngôn ngữ và phần cứng khác) và không có giá trị vô hạn hoặc NaN đặc biệt, do đó, ném ngoại lệ là một hành vi hữu ích ở đó.
Câu trả lời đúng cho câu hỏi này nên là điều này. Tôi cần biết tại sao 'float' và' double' không gây ra ngoại lệ. Cảm ơn. –
Đây phải là câu trả lời chính xác được đánh dấu.Câu trả lời hiện được đánh dấu là chính xác không trả lời được câu hỏi, cũng không làm rõ rằng Java đang theo chuẩn IEEE 754. – Necrototem
Mặc dù các nhà phát triển Java biết về loại nguyên thủy đôi và Double
lớp, trong khi làm nổi điểm số học họ không chú ý đủ để Double.INFINITY
, NaN
, -0.0
và các quy tắc khác chi phối các tính toán số học liên quan đến họ.
Câu trả lời đơn giản cho câu hỏi này là nó sẽ không ném ArithmeticException
và trả lại Double.INFINITY
. Ngoài ra, hãy lưu ý rằng so sánh x == Double.NaN
luôn luôn đánh giá là false
, ngay cả khi x
chính nó là NaN
.
Để kiểm tra xem x
có phải là NaN
không, hãy sử dụng phương thức gọi Double.isNaN(x)
để kiểm tra xem số đã cho có phải là NaN hay không. Địa chỉ này rất gần với NULL
trong SQL
.
Nó có thể hữu ích cho bạn.
Khi chia cho zero (0 hoặc 0,00)
Nếu bạn chia đôi bởi 0, JVM sẽ hiển thị Infinity.
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
Console:
Infinity
Nếu bạn chia int bằng 0, sau đó JVM sẽ ném Arithmetic Exception.
public static void main(String [] args){ int a=10; System.out.println(a/0); }
Console:
Exception in thread "main" java.lang.ArithmeticException:/by zero
Nhưng nếu chúng ta chia int bằng 0,0, sau đó JVM sẽ hiển thị Infinity:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
Console:
Infinity
Điều này là do JVM sẽ tự động gõ int int để tăng gấp đôi, vì vậy chúng tôi nhận được vô cùng thay vì ArithmeticException.
- 1. 0.0/0.0 trong C# sẽ không ném "Đã cố gắng chia cho số không."?
- 2. Tại sao Servlet.service() cho servlet jsp ném ngoại lệ này?
- 3. Tại sao không thể ném ngoại lệ từ __toString()?
- 4. Giao diện Java ném ngoại lệ nhưng việc triển khai giao diện không ném ngoại lệ?
- 5. Ném ngoại lệ tùy chỉnh trong Java
- 6. Tại sao Property Set ném ngoại lệ StackOverflow?
- 7. Tại sao std :: locale loc ("en_") ném một ngoại lệ?
- 8. ném ngoại lệ
- 9. Gửi email khi ngoại lệ bị ném
- 10. Tại sao canvas.toDataURL() ném một ngoại lệ bảo mật?
- 11. Java: lớp học ném ngoại lệ?
- 12. Tại sao tôi không thể ném ngoại lệ trong khi sử dụng toán tử bậc ba
- 13. Tại sao getCanonicalPath ném ngoại lệ đã kiểm tra trong khi getAbsolutePath thì không?
- 14. Tại sao trình duyệt không ném ngoại lệ cho lỗi cú pháp?
- 15. Tại sao ngoại lệ Java của tôi không in dấu vết ngăn xếp khi được ném vào trong một SwingWorker?
- 16. Ném nhiều ngoại lệ trong Java
- 17. kiểu java cho danh sách ngoại lệ dài ném
- 18. ném mới std :: ngoại lệ vs ném std :: ngoại lệ
- 19. Phân chia Java bằng 0 không ném một ArithmeticException - tại sao?
- 20. HttpWebRequest là ném ngoại lệ cho 404
- 21. Destructor không được gọi khi một ngoại lệ được ném
- 22. Tại sao phân chia hai số nguyên trả về 0.0 trong Java?
- 23. Trả lại sau khi ném ngoại lệ
- 24. java ném ngoại lệ mà không bắt nó?
- 25. recursive_directory_iterator ném ngoại lệ
- 26. Tại sao trình nối tiếp XML ném ngoại lệ ký tự không hợp lệ khi ký tự nằm trong CDATA?
- 27. autoFocus ném ngoại lệ
- 28. CXF client ngoại lệ: Interceptor cho {XXX} đã ném ngoại lệ, ươm tại
- 29. Tomcat không thể tìm thấy Servlet của tôi và đang ném ngoại lệ, nhưng tại sao?
- 30. BeginInvoke ném ngoại lệ
Câu hỏi hay - sự không thống nhất giữa số nguyên và hành vi kép làm tăng thêm sự nhầm lẫn và rắc rối. –
bản sao có thể có của [Tại sao phân chia bằng không với số dấu chấm động (hoặc độ chính xác gấp đôi) không ném java.lang.ArithmeticException:/bằng 0 trong Java] (http://stackoverflow.com/questions/12954193/why-does- chia-by-zero-với-floating-point-hoặc-double-precision-numbers-not) – Raedwald
@Raedwald - xem xét câu hỏi này đã được đăng 2 1/2 năm trước khi bạn liên kết, tôi sẽ nói câu hỏi đó là (có thể) trùng lặp cái này :) – froadie