Chúng ta có thể mất độ chính xác với phương thức toString() không?
Loại ... Cả Float.toString()
và Double.toString()
chỉ xuất số chữ số sau dấu tách thập phân, được yêu cầu cho đầu ra duy nhất tương ứng với giá trị float hoặc kép.
Để sử dụng ví dụ 0,35 trong câu trả lời david99world của, hãy xem xét đoạn mã sau:
BigDecimal bd1 = new BigDecimal(0.35);
Number n = 0.35;
BigDecimal bd2 = new BigDecimal(n.toString());
System.out.println(bd1);
System.out.println(bd2);
Một sự mong đợi trực quan có thể là hai trường hợp BigDecimal là giống hệt nhau, nhưng sản lượng cho thấy rằng họ không phải là:
0.34999999999999997779553950749686919152736663818359375
0.35
Dòng đầu tiên là giá trị chính xác của số double, vì 0,35 không thể được biểu diễn chính xác. Dòng thứ hai là 0,35, vì không cần thêm số thập phân để biểu thị giá trị khác biệt. Ví dụ. tuyên bố 0.34999999999999997779553950749686919152736663818359375 == 0.35
sẽ đánh giá là true
.
Điều này thực sự không mất chính xác khi tạo BigDecimal, độ không chắc chắn đã có trong giá trị "nguồn" của bạn. Vấn đề là thay vào đó các giá trị rời rạc có thể sử dụng ví dụ: một giá trị float hoặc double là nguồn không nhất thiết sẽ được biểu diễn bằng giá trị tương đương chính xác trong cá thể BigDecimal.
mã của bạn có thể ném 'NumberFormatException' - nếu' number' là 'Double' là Infinity hoặc NaN http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Double .html # toString (double) –
Cảm ơn mẹo! Tôi quên kiểm tra điều này –