Nếu bạn đọc tài liệu API, bạn sẽ thấy taht String.valueOf(dobule)
sử dụng Double.toString(double)
để định dạng giá trị. Có thể không rõ ràng, nhưng Double.toString(double)
làm tròn giá trị, trước khi định dạng nó thành một chuỗi:
Có bao nhiêu chữ số được in cho phần phân đoạn của m hoặc a? Phải có ít nhất một chữ số để đại diện cho phần phân số và vượt quá số lượng đó, nhưng chỉ cần nhiều, nhiều chữ số càng cần để phân biệt duy nhất giá trị đối số từ các giá trị liền kề loại kép. Đó là, giả sử rằng x là giá trị toán học chính xác được biểu diễn bằng biểu diễn thập phân được tạo ra bởi phương pháp này cho một đối số không đồng nhất hữu hạn d. Sau đó, d phải là giá trị gấp đôi gần nhất đến x; hoặc nếu hai giá trị tăng gấp đôi là bình đẳng gần với x, sau đó d phải một trong số họ và các bit quan trọng nhất của significand của d phải được 0.
Kết quả của việc này là String.valueOf(131.7d)
sẽ trả lại chuỗi "131.7" ngay cả khi giá trị chính xác của đối số là 131.69999999999998863131622783839702606201171875. Lý do cho điều này là phân số thập phân không phải lúc nào cũng được biểu diễn chính xác bằng cách sử dụng phân số nhị phân (như được sử dụng với phao và tăng gấp đôi).
Vì vậy, mới new BigDecimal(String.valueOf(131.7))
sẽ tạo một BigDecimal với giá trị chính xác 131,7. new BigDecimal(131.7)
sẽ tạo một BigDecimal với giá trị chính xác 131.69999999999998863131622783839702606201171875.
để những người bỏ phiếu đóng gần như trùng lặp, các câu hỏi tương tự nhưng không trùng lặp. – Woot4Moo