Tôi đã có một chút tò mò về điều này. Math.random() đưa ra một giá trị trong phạm vi [0.0.1.0). Vậy giá trị lớn nhất có thể là gì? Nói cách khác, giá trị gấp đôi gần nhất với 1.0 nhỏ hơn 1.0 là bao nhiêu?Java: Math.random() Giá trị lớn nhất (gấp đôi chỉ dưới 1)
Trả lời
Java sử dụng 64-bit IEEE-754 đại diện, do đó số gần nhất nhỏ hơn một là về mặt lý thuyết 3FEFFFFFFFFFFFFF
trong đại diện thập lục phân, mà là 0 cho dấu, -1 cho số mũ, và 1,9999999999999997 cho câu hỏi 52 bit. Điều này tương đương với khoảng 0.9999999999999998
.
Tham chiếu: IEEE-754 Calculator.
Giá trị dương nhỏ nhất của một đôi là Double.MIN_NORMAL
. Vì vậy, số lớn nhất nhỏ hơn 1.0 là 1.0-Double.MIN_NORMAL
.
Double.MIN_NORMAL
bằng 2 -1022, vì vậy câu trả lời vẫn là cực kỳ gần 1.0. Bạn sẽ phải in giá trị của 1.0-Double.MIN_NORMAL
-308 chữ số thập phân trước khi bạn có thể nhìn thấy bất cứ điều gì nhưng một 9.
Rất tiếc, khi tôi mã hoá '1.0 - Double.MIN_NORMAL == 1.0' trong System.out.println, tôi nhận được sự thật. Nhưng khi tôi encase 0,9999999999999999 trong System.out.println, tôi nhận được sai. Vậy điều đó có nghĩa là 0,9999999999999999 là gấp đôi gần nhất? – Justin
Hum ... Không, vì vậy, MIN_NORMAL áp dụng cho giá trị _closest đến zero_ Đó là loại lỗi nhỏ nhất có thể trên các giá trị IEEE-754. Nhưng kể từ khi bạn di chuyển về phía 1, một số độ chính xác bị mất! – mjv
'System.out.println (Double.MinNormal)' cho 2.2250738585072014E-308. Khá nhỏ. – Justin
Số mà bạn muốn được trả lại bởi Math.nextAfter(1.0, -1.0)
.
Tên của hàm có phần sai. Math.nextAfter(a, 1.0)
trả về giá trị đôi nhất đó là lớn hơn a
(ví dụ, giá trị tiếp theo sau khi a
), và Math.nextAfter(a, -1.0)
trả về giá trị lớn nhất mà nhỏ hơn a
(ví dụ, giá trị trướca
).
Lưu ý: Một áp phích khác cho biết, 1.0-Double.MIN_NORMAL
. Sai rồi. 1.0-Double.MIN_NORMAL
chính xác bằng 1.0.
- 1. Gấp đôi giá trị trả về 0
- 2. Tạo mô hình vô cùng cho giá trị gấp đôi lớn nhất
- 3. Giá trị lớn nhất so với kích thước dài và gấp đôi trong .NET
- 4. Lặp lại tất cả giá trị có thể gấp đôi
- 5. Điều gì lớn hơn gấp đôi?
- 6. Tại sao giá trị gấp đôi này được in dưới dạng "-0"?
- 7. Định dạng gấp đôi thành ít nhất một chữ số quan trọng trong Java/Android
- 8. dài gấp đôi so với đôi
- 9. Tạo một số ngẫu nhiên gấp đôi của một phạm vi nhất định trong Java
- 10. Chức năng C++ để tìm giá trị tối đa trong một mảng tăng gấp đôi?
- 11. Giá trị lớn nhất của unsigned char
- 12. C++ đúc tĩnh hai chiều mảng đôi tăng gấp đôi **
- 13. chuyển đổi gấp đôi lên số nguyên trong java
- 14. Tại sao (gấp đôi) 0.6f> (gấp đôi) (6/10f)?
- 15. lợi nhuận gấp đôi dài và ctypes
- 16. Tại sao Math.ceil trả lại gấp đôi?
- 17. để so sánh gấp đôi và số thập phân tôi có nên truyền gấp đôi sang thập phân hay thập phân để tăng gấp đôi không?
- 18. Số thập phân/tăng gấp đôi thành số nguyên - làm tròn lên (không chỉ gần nhất)
- 19. Cho giá trị gấp đôi vào Geopoint trong lớp phủ GoogleMap
- 20. Math.floor (Math.random()) +1 thực sự làm gì?
- 21. Cảnh báo: number_format() dự kiến tham số 1 để được tăng gấp đôi
- 22. Làm thế nào để quyết định liệu giá trị đã cho là nổi hay gấp đôi trong Java?
- 23. mảng loại tăng gấp đôi trong C
- 24. Tuyên bố hợp nhất Oracle SQL với chỉ 1 bảng và một loạt các giá trị
- 25. Finding chứa giá trị lớn nhất bằng R
- 26. cho vòng lặp, tăng thêm gấp đôi
- 27. Tại sao ToString() Làm tròn giá trị gấp đôi của tôi?
- 28. vấn đề trong so sánh giá trị gấp đôi với php
- 29. Nhân một giá trị gấp đôi với 100.0 giới thiệu lỗi làm tròn?
- 30. PHP chọn giá trị `id` lớn nhất từ bảng MySQL
Còn khoảng 0.9999999999999999 thì sao? nó có cùng số chữ số, nhưng có số 9 thay vì số 8 ở cuối. Khi tôi 'System.out.println (0.9999999999999999 - 0.9999999999999998)', tôi nhận được: 1.1102230246251565E-16 – Justin
@gangqinlaohu Chữ số cuối cùng không chính xác. Tôi cắt ngắn số mà tôi nhận được từ máy tính IEEE-754 (xem liên kết trong câu trả lời) để lấy số. Chữ số tiếp theo sau 8 cũng là 8, vì vậy nếu bạn áp dụng làm tròn, kết quả sẽ trở thành 0.9999999999999999. – dasblinkenlight
Ồ, vì vậy, 0,9999999999999999 là gần hơn 0,9999999999999998, bởi vì 0,9999999999999998 bị cắt ngắn, do đó, Double gần 1 là 0,9999999999999999. – Justin