BigDecimal setScale và vòng


140

Sự khác biệt giữa hai cuộc gọi này là gì? (Có cái nào không?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

6
ngoài các câu trả lời được chấp nhận bên dưới - setScale () tạo ra một đối tượng mới của BigDecimal - được cung cấp một lớp bất biến
prash

9
@prash roundphương thức cũng trả về một thể hiện mới của BigDecimal bởi vì, như bạn đã nói, các thể hiện là bất biến.
daiscog

Câu trả lời:


212

Một điểm quan trọng được ám chỉ nhưng không được đề cập trực tiếp là sự khác biệt giữa "độ chính xác""tỷ lệ" và cách chúng được sử dụng trong hai tuyên bố. "Độ chính xác" là tổng số chữ số có nghĩa trong một số. "Tỷ lệ" là số chữ số ở bên phải dấu thập phân.

Hàm tạo MathContext chỉ chấp nhận độ chính xác và RoundingMode làm đối số và do đó thang đo không bao giờ được chỉ định trong câu lệnh đầu tiên.

setScale() rõ ràng chấp nhận tỷ lệ như một đối số, cũng như RoundingMode, tuy nhiên độ chính xác không bao giờ được chỉ định trong câu lệnh thứ hai.

Nếu bạn di chuyển dấu thập phân một nơi sang phải, sự khác biệt sẽ trở nên rõ ràng:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

38
Re: "" chính xác "là tổng số chữ số trong một số." Số chính xác là số chữ số có nghĩa. Độ chính xác của 0,000042M là 2.
David J.

2
Xem: "độ chính xác": Số chữ số bắt đầu từ chữ số khác không ngoài cùng của kết quả chính xác. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

nếu "Độ chính xác là số chữ số có nghĩa" hơn tại sao độ chính xác của 0,0000009 lại là 2? nó phải là 1
Sanchi Girotra

1
Giá trị của BigDecimal của bạn được thiết lập như thế nào? Làm thế nào bạn xuất ra giá trị (sử dụng String.format () có thể ẩn các chữ số có nghĩa)?
dale peters

1
@SanchiGirotra Độ chính xác là "số chữ số trong giá trị không được tính". Một chính xác của 2 với một chưa định tỷ lệ giá trị của 90 và thang điểm từ 8 cung cấp cho 0,0000009. Cũng như độ chính xác là 1, giá trị không được tính là 9 và thang điểm là 7.
daiscog

52

Thực sự có một sự khác biệt lớn, mà bạn nên ghi nhớ. setScale thực sự đặt tỷ lệ của số của bạn trong khi vòng làm tròn số của bạn thành các chữ số được chỉ định NHƯNG nó "bắt đầu từ chữ số ngoài cùng bên trái của kết quả chính xác" như được đề cập trong jdk. Vì vậy, liên quan đến mẫu của bạn, kết quả là như nhau, nhưng hãy thử 0,0034 thay thế. Đây là lưu ý của tôi về điều đó trên blog của tôi:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-b between.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.