Đó là hai câu hỏi riêng biệt: "Tôi nên sử dụng để làm BigDecimal
gì?" và "Nói chung tôi phải làm gì?"
Vì BigDecimal
: điều này hơi khó, vì họ không làm điều tương tự . BigDecimal.valueOf(double)
sẽ sử dụng biểu diễn chính tắcString
của double
giá trị được truyền vào để khởi tạo BigDecimal
đối tượng. Nói cách khác: Giá trị của BigDecimal
đối tượng sẽ là những gì bạn nhìn thấy khi làm System.out.println(d)
.
new BigDecimal(d)
Tuy nhiên, nếu bạn sử dụng , thì dấu BigDecimal
sẽ cố gắng thể hiện double
giá trị chính xác nhất có thể . Điều này thường sẽ dẫn đến việc lưu trữ nhiều chữ số hơn bạn muốn. Nói một cách chính xác, nó đúng hơn valueOf()
, nhưng nó kém trực quan hơn rất nhiều.
Có một lời giải thích hay về điều này trong JavaDoc:
Kết quả của hàm tạo này có thể hơi khó đoán. Người ta có thể giả định rằng viết bằng new BigDecimal(0.1)
Java tạo ra một BigDecimal
giá trị chính xác bằng 0,1 (một giá trị chưa được chia tỷ lệ là 1, với tỷ lệ là 1), nhưng nó thực sự bằng 0,10000000000000055511151231257827021181583404541015625. Điều này là do 0,1 không thể được biểu diễn chính xác dưới dạng a double
(hoặc, đối với vấn đề đó, dưới dạng phân số nhị phân của bất kỳ độ dài hữu hạn nào). Do đó, giá trị đang được chuyển vào hàm tạo không chính xác bằng 0,1, mặc dù xuất hiện.
Nói chung, nếu kết quả giống nhau (nghĩa là không phải trong trường hợp của BigDecimal
, mà trong hầu hết các trường hợp khác), thì valueOf()
nên được ưu tiên hơn: nó có thể thực hiện lưu vào bộ nhớ đệm của các giá trị chung (như đã thấy ở trên Integer.valueOf()
) và thậm chí nó có thể thay đổi hành vi bộ nhớ đệm mà không người gọi phải được thay đổi. new
sẽ luôn khởi tạo một giá trị mới, ngay cả khi không cần thiết (ví dụ tốt nhất: new Boolean(true)
so với Boolean.valueOf(true)
).