2016-02-16 27 views
26

Tôi đang sử dụng BigDecimal cho các số của mình trong ứng dụng của mình, ví dụ, với JPA. Tôi đã làm một chút nghiên cứu về các thuật ngữ 'chính xác' và 'quy mô' nhưng tôi không hiểu chính xác chúng là gì.BigDecimal, precision và scale

Mọi người có thể giải thích cho tôi ý nghĩa của 'độ chính xác' và 'tỷ lệ' cho giá trị BigDecimal không?

@Column(precision = 11, scale = 2) 

Cảm ơn!

+0

Câu hỏi hoàn toàn không có gì với 'java.math.BigDecimal'. '@ javax.persistence.Column' không phải là một phần của Java SE. Đó là chủ đề của JPA. – Tiny

+1

Độ chính xác và tỷ lệ là các thuật ngữ thường được sử dụng cho java.math.BigDecimal, đó là những gì anh ta sử dụng để tính toán, ví dụ với JPA. ISTM anh ta hoặc cô ấy muốn biết những gì họ có ý nghĩa trong bối cảnh của BigDecimal alright. –

Trả lời

39

A BigDecimal được xác định bởi hai giá trị: số nguyên chính xác tùy ý và số nguyên 32 bit tỷ lệ. Giá trị của BigDecimal được xác định là unscaledValue*10^{-scale}.

chính xác:

Các precision là số chữ số trong giá trị chưa định tỷ lệ. Ví dụ, đối với số 123,45, độ chính xác trở lại là 5.

Vì vậy, chính xác chỉ ra chiều dài của số nguyên có độ chính xác tùy ý. Dưới đây là một vài ví dụ về số với quy mô tương tự, nhưng độ chính xác khác nhau:

  • 12345/100000 = 0,12345 // quy mô = 5, độ chính xác = 5
  • 12340/100000 = 0,1234 // quy mô = 5, chính xác = 4
  • 1/100000 = 0,00001 // quy mô = 5, độ chính xác = 1

Trong trường hợp đặc biệt mà số là bằng không (tức là 0,000), độ chính xác luôn là 1.

Quy mô:

Nếu không hay tích cực, scale là số chữ số bên phải dấu thập phân. Nếu âm, giá trị unscaled của số được nhân với mười đến sức mạnh của sự phủ định của thang đo. Ví dụ: thang tỷ lệ -3 có nghĩa là giá trị chưa được đánh số nhân với 1000.

Điều này có nghĩa là giá trị nguyên của ‘BigDecimal’ được nhân với 10^{-scale}.

Dưới đây là một vài ví dụ về độ chính xác tương tự, với quy mô khác nhau:

  • 12345 với quy mô 5 = 0,12345
  • 12345 với quy mô 4 = 1,2345
  • ...
  • 12345 với quy mô 0 = 12345
  • 12345 với tỷ lệ -1 = 123450

BigDecimal.toString:

Phương pháp toString cho một BigDecimal xử lý khác nhau dựa trên quy mô và precision. (Cảm ơn @RudyVelthuis vì đã chỉ ra điều này.)

  • Nếu số scale == 0, số nguyên chỉ được in ra, nguyên trạng.
  • Nếu scale < 0, E-Notation luôn được sử dụng (ví dụ 5 quy mô sản xuất -1 "5E + 1")
  • Nếu scale >= 0precision - scale -1 >= -6 một số thập phân đơn giản được tạo ra (ví dụ 10000000 tỷ lệ 1 sản xuất "1.000.000,0")
  • Nếu không, ký hiệu điện tử sẽ được sử dụng, ví dụ 10 thang 8 tạo ra "1.0E-7" từ precision - scale -1 bằng unscaledValue*10^{-scale} nhỏ hơn -6.

Thêm ví dụ:

  • 19/100 = 0,19 // integer = 19, quy mô = 2, độ chính xác = 2
  • 1/1000 = 0,0001 // integer = 1, quy mô = 4, độ chính xác = 1
+2

Trên thực tế, '[12345, -1]' được biểu diễn tốt hơn bằng '1.2345E + 5', có lẽ là' ToString' cũng sẽ trả về. Nếu không, lời giải thích rất hay. –

+1

Giải thích tuyệt vời với các ví dụ! – jpadilladev

+0

@RudyVelthuis Cảm ơn, tôi đã thêm một phần giải thích cách thức phương thức toString xác định whethe hoặc không sử dụng ký hiệu E + –

3

Trích dẫn Javadoc:

Độ chính xác là số chữ số trong giá trị chưa định tỷ lệ.

Nếu không hay tích cực, quy mô là số chữ số bên phải dấu thập phân. Nếu âm, giá trị unscaled của số được nhân với mười đến sức mạnh của sự phủ định của thang đo. Ví dụ, thang điểm từ -3 nghĩa là giá trị chưa định tỷ lệ được nhân với 1000.

14

chính xác: Tổng số chữ số có nghĩa

Quy mô: Số chữ số bên phải dấu thập phân

(Source)

0

Từ ví dụ của bạn chú thích các chữ số tối đa là 2 sau dấu thập phân và 9 trước (tổng cộng 11): 123456789,01