Như những người khác đã đề cập, có lẽ bạn sẽ muốn sử dụng BigDecimal
lớp, nếu bạn muốn có một đại diện chính xác là 11.4.
Bây giờ, một lời giải thích nhỏ về lý do tại sao điều này đang xảy ra:
Các kiểu nguyên thủy float
và double
nguyên thủy trong Java là các số dấu phẩy động , trong đó số được lưu trữ dưới dạng biểu diễn nhị phân của một phân số và số mũ.
Cụ thể hơn, giá trị dấu phẩy động có độ chính xác kép, chẳng hạn như double
loại là giá trị 64 bit, trong đó:
- 1 bit biểu thị dấu (dương hoặc âm).
- 11 bit cho số mũ.
- 52 bit cho các chữ số có nghĩa (phần phân số dưới dạng nhị phân).
Những phần này được kết hợp để tạo ra một double
đại diện của một giá trị.
(Nguồn: Wikipedia: Độ chính xác kép )
Để biết mô tả chi tiết về cách xử lý các giá trị dấu phẩy động trong Java, hãy xem Phần 4.2.3: Các loại dấu phẩy động , Định dạng và Giá trị của Đặc tả ngôn ngữ Java.
Các byte
, char
, int
, long
loại được cố định điểm số, đó là representions chính xác của con số. Không giống như các số điểm cố định, một số số dấu phẩy động sẽ đôi khi (an toàn khi giả sử "hầu hết thời gian") không thể trả về một đại diện chính xác của một số. Đây là lý do tại sao bạn kết thúc với 11.399999999999
kết quả là 5.6 + 5.8
.
Khi yêu cầu một giá trị chính xác, chẳng hạn như 1.5 hoặc 150.1005, bạn sẽ muốn sử dụng một trong các loại điểm cố định, có thể biểu thị chính xác số.
Như đã đề cập nhiều lần rồi, Java có một BigDecimal
lớp sẽ xử lý số lượng rất lớn và số lượng rất nhỏ.
Từ tham chiếu API Java cho BigDecimal
lớp:
Số thập phân bất biến, chính xác tùy ý. Một BigDecimal bao gồm một giá trị nguyên không chính xác tùy ý và tỷ lệ số nguyên 32 bit. Nếu bằng 0 hoặc dương, thang đo là số chữ số ở bên phải dấu thập phân. Nếu âm, giá trị không được tính của số được nhân với mười với sức mạnh của phủ định của thang đo. Do đó, giá trị của số được đại diện bởi BigDecimal là (unscaledValue × 10 ^ -scale).
Đã có nhiều câu hỏi về Stack Overflow liên quan đến vấn đề số dấu phẩy động và độ chính xác của nó. Dưới đây là danh sách các câu hỏi liên quan có thể được quan tâm:
Nếu bạn thực sự muốn tìm hiểu chi tiết về các số dấu phẩy động, hãy xem những gì mọi nhà khoa học máy tính nên biết về số học dấu phẩy động .