2009-03-13 46 views
15

Tôi có kết quả tính toán BigDecimal mà tôi cần làm tròn đến khoảng thời gian được chỉ định gần nhất (trong trường hợp này là kích thước đánh dấu thị trường tài chính).Làm tròn Java BigDecimal đến khoảng cách gần nhất

ví dụ: Giá [Kích thước đánh dấu] -> Giá làm tròn

100.1 [0.25] -> 100 
100.2 [0.25] -> 100.25 
100.1 [0.125] -> 100.125 
100.2 [0.125] -> 100.25 

Cảm ơn.

Cập nhật: giải pháp schnaader của, dịch sang từ ngữ Java/BigDecimal:

price = price.divide(tick).setScale(0, RoundingMode.HALF_UP).multiply(tick) 
+1

Đối với khả năng tìm kiếm, kỹ thuật này có thể được sử dụng để làm tròn giá trị phần trăm đối với một số phần độc đoán của một điểm cơ bản. –

Trả lời

13

Bạn có thể bình thường hóa kích thước đánh dấu và sau đó sử dụng các phương pháp làm tròn thông thường:

100.1 [0.25] -> * (1/0.25) -> 400.4 [1] -> round -> 400 ->/(1/0.25) -> 100 
100.2 [0.25] -> * (1/0.25) -> 400.8 [1] -> round -> 401 ->/(1/0.25) -> 100.25 

Vì vậy, nó nên là:

Price = Round(Price/Tick) * Tick; 

Cũng lưu ý rằng bạn dường như phải đặt chế độ làm tròn chính xác cho BigDecima ls. Xem ví dụ BigDecimal Docs. Vì vậy, bạn nên chắc chắn để thiết lập này chính xác và viết một số xét nghiệm để kiểm tra tính chính xác của mã của bạn.

+0

Trông cảm ơn bạn! Trong các thuật ngữ Java/BigDecimal, điều này được dịch thành khá xấu: price.divide (tick) .setScale (0, RoundingMode.HALF_UP) .multiply (tick) – Jon

1
p= p - p % t + ((p % t < t/2) ? 0.0 : t); 

// trong đó p = giá và t = increment đánh dấu

Các vấn đề liên quan