Tôi có một số XSD yêu cầu tôi sử dụng BigDecimal cho lat/lon. Tôi hiện có lat/lon là tăng gấp đôi và chuyển đổi chúng thành BigDecimal, nhưng tôi chỉ được yêu cầu sử dụng khoảng 12 vị trí chính xác. Tôi đã không thể tìm ra cách để thiết lập điều đó. Bất cứ ai có thể giúp tôi với điều này?Đặt độ chính xác cụ thể của BigDecimal
Trả lời
Bạn có thể sử dụng setScale() ví dụ:
double d = ...
BigDecimal db = new BigDecimal(d).setScale(12, BigDecimal.ROUND_HALF_UP);
Duh. Nhìn lại lỗi mà tôi nhận được, nó nói làm tròn là cần thiết. Tôi đã chỉ thực hiện .setScale (12). Một khi tôi xác nhận nó hoạt động, tôi sẽ làm cho nó như được trả lời. Cảm ơn. – Jason
Tôi không biết tại sao nó không chỉ sử dụng một phương thức làm tròn mặc định như đúc, tôi chỉ thấy ROUND_HALF_UP được sử dụng. Nó khá là giả tạo. ;) –
+1 vì điều này đã giúp tôi với tự động hóa của tôi hôm nay :) – Brian
Tiêu đề của câu hỏi hỏi về độ chính xác. BigDecimal phân biệt giữa quy mô và độ chính xác. Tỷ lệ là số vị trí thập phân. Bạn có thể nghĩ chính xác là số lượng significant figures, còn được gọi là chữ số có nghĩa.
Một số ví dụ trong Clojure.
(.scale 0.00123M) ; 5
(.precision 0.00123M) ; 3
(Trong Clojure, The M
chỉ định một BigDecimal đen. Bạn có thể dịch các Clojure Java nếu bạn thích, nhưng tôi thấy nó là nhỏ gọn hơn Java!)
Bạn có thể dễ dàng tăng quy mô:
(.setScale 0.00123M 7) ; 0.0M
Nhưng bạn không thể giảm quy mô trong cùng một cách chính xác:
(.setScale 0.00123M 3) ; ArithmeticException Rounding necessary
Bạn sẽ cần phải vượt qua một chế độ làm tròn quá:
(.setScale 0.00123M 3 BigDecimal/ROUND_HALF_EVEN) ;
; Note: BigDecimal would prefer that you use the MathContext rounding
; constants, but I don't have them at my fingertips right now.
Vì vậy, nó rất dễ dàng để thay đổi quy mô. Nhưng chính xác thì sao? Đây không phải là dễ dàng như bạn có thể hy vọng!
Nó rất dễ dàng để giảm độ chính xác:
(.round 3.14159M (java.math.MathContext. 3)) ; 3.14M
Nhưng nó không phải là rõ ràng làm thế nào để tăng độ chính xác:
(.round 3.14159M (java.math.MathContext. 7)) ; 3.14159M (unexpected)
Đối với hoài nghi, đây là không chỉ là một số dấu 0 không được hiển thị:
(.precision (.round 3.14159M (java.math.MathContext. 7))) ; 6
; (same as above, still unexpected)
FWIW, Clojure là cẩn thận với số không đuôi và sẽ cho họ thấy:
4.0000M ; 4.0000M
(.precision 4.0000M) ; 5
lại đi đúng hướng ... Bạn có thể thử sử dụng một constructor BigDecimal, nhưng nó không được thiết lập độ chính xác cao hơn so với bất kỳ số chữ số bạn chỉ định:
(BigDecimal. "3" (java.math.MathContext. 5)) ; 3M
(BigDecimal. "3.1" (java.math.MathContext. 5)) ; 3.1M
Vì vậy, không có cách nào nhanh chóng để thay đổi độ chính xác. Tôi đã dành thời gian chiến đấu này trong khi viết lên câu hỏi này và với một dự án tôi đang làm việc. Tôi xem xét điều này, tốt nhất, A CRAZYTOWN API, và tồi tệ nhất là một lỗi. Những người. Nghiêm túc?
Vì vậy, tốt nhất tôi có thể nói, nếu bạn muốn thay đổi độ chính xác, bạn sẽ cần phải làm các bước sau:
- Lookup độ chính xác hiện hành.
- Tra cứu tỷ lệ hiện tại.
- Tính toán thay đổi tỷ lệ.
- Đặt quy mô mới
Những bước này, như mã Clojure:
(def x 0.000691M) ; the input number
(def p' 1) ; desired precision
(def s' (+ (.scale x) p' (- (.precision x)))) ; desired new scale
(.setScale x s' BigDecimal/ROUND_HALF_EVEN)
; 0.0007M
tôi biết, đây là một rất nhiều bước chỉ để thay đổi chính xác!
Tại sao BigDecimal không cung cấp tính năng này? Tôi đã bỏ qua một cái gì đó?
Điều gì về 'BigDecimal.round (MathContext mới (chính xác, RoundingModel.ROUND_HALF_EVEN))'? –
@ PaŭloEbermann Bạn đang hỏi hoặc đề xuất? Bạn đã thử chưa? Chăm sóc chia sẻ kết quả chi tiết cho các ví dụ tôi chạy qua trong câu trả lời của tôi? Nếu vậy, tôi nghĩ rằng nó đảm bảo một câu trả lời riêng biệt. –
Đối với bất kỳ ai thích tôi và không biết một chút về Clojure, tôi nghĩ giải pháp được hiển thị ở đây là 'x.setScale (x.scale() + p - x.precision(), RoundingMode.HALF_UP)', trong đó ' x' là 'BigDecimal' bạn muốn làm tròn, và' p' là số lượng các số liệu quan trọng bạn muốn giữ lại. Nó làm việc cho tôi, nhưng sửa tôi nếu tôi sai! – Nateowami
BigDecimal decPrec = (BigDecimal)yo.get("Avg");
decPrec = decPrec.setScale(5, RoundingMode.CEILING);
String value= String.valueOf(decPrec);
Bằng cách này bạn có thể đặt độ chính xác cụ thể của BigDecimal
.
Ở đây, giá trị của decPrec là 1,5726903423607562595809913132345426 được làm tròn đến 1,57267
Hãy thử mã này ...
Integer perc = 5;
BigDecimal spread = BigDecimal.ZERO;
BigDecimal perc = spread.setScale(perc,BigDecimal.ROUND_HALF_UP);
System.out.println(perc);
Kết quả: 0,00000
- 1. Cách đặt độ chính xác của phao
- 2. Hibernate mất độ chính xác trong kết quả khi ánh xạ một số (22,21) để BigDecimal
- 3. Độ chính xác của Cython
- 4. Giá trị kép với độ chính xác cụ thể trong java
- 5. Độ chính xác của CLLocation chính xác đến mức nào?
- 6. độ chính xác chiều sâu opencv độ chính xác
- 7. Độ chính xác của MediaPlayer.seekTo (int msecs)
- 8. Điều gì làm tăng độ chính xác và độ chính xác theo chiều dọc của CLLocation?
- 9. Làm cách nào để đặt độ chính xác của dấu chấm động trong Perl?
- 10. Unpredictability của BigDecimal (double) constructor
- 11. Độ chính xác độ cao CLLocation
- 12. Tọa độ GPS chính xác
- 13. Độ chính xác của tiêu chuẩn :: to_string (double)
- 14. Độ chính xác ngày giờ?
- 15. Không thể đặt khung chính xác trước khi xemDidAppear
- 16. Độ chính xác của ScheduledExecutorService trên OS bình thường/JVM
- 17. Độ chính xác trong python
- 18. Đặt độ chính xác của tiêu chuẩn :: to_string khi chuyển đổi giá trị dấu phẩy động
- 19. Độ chính xác của phép nhân đôi chính xác trong java?
- 20. BigDecimal không thể bị ép buộc thành BigDecimal
- 21. chính xác của Math.random()
- 22. Làm thế nào tôi có thể thiết lập mức độ chính xác cho bignum của Perl?
- 23. Làm thế nào chúng ta có thể cắt phao float64 loại thành một độ chính xác cụ thể trong golang?
- 24. Độ chính xác của accept_language để phát hiện quốc gia
- 25. Thay đổi độ chính xác của cột số trong Oracle
- 26. Sự khác biệt giữa 'độ chính xác' và 'độ chính xác' là gì?
- 27. Độ chính xác hẹn giờ OpenVMS, tốt hơn độ chính xác mili giây.
- 28. Độ chính xác không gian tên
- 29. Độ chính xác điểm nổi của tập hợp SQL
- 30. Độ chính xác của Math.Sin() và Math.Cos() trong C#
Bạn đã cố gắng cho các nhà xây dựng một MathContext? – bdares
Nếu tôi thấy chính xác, bạn đang nói về các chữ số thập phân, không phải là độ chính xác của dấu phẩy động. Ít nhất câu trả lời được chấp nhận sẽ dẫn đến 12 chữ số thập phân, chứ không phải 12 chữ số chính xác. – vbence