2009-03-13 14 views
15

Ho un risultato di calcolo BigDecimal che devo arrotondare all'intervallo specificato più prossimo (in questo caso è la dimensione del tick del mercato finanziario).Arrotondamento di un BigDecimal Java all'intervallo più vicino

ad es. Prezzo [Tick Size] -> Prezzo arrotondato

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

Grazie.

Update: soluzione schnaader, tradotto in termini Java/BigDecimal:

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

Per reperibilità, questa tecnica può essere usata per arrotondare un valore percentuale per alcune frazioni arbitraria di un punto base. –

risposta

13

Si potrebbe normalizzare dimensioni tick e poi usare i soliti metodi di arrotondamento:

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 

Così dovrebbe essere:

Inoltre, sembra che sia necessario impostare la modalità di arrotondamento corretta per BigDecima ls. Vedere BigDecimal Docs per esempio. Quindi dovresti assicurarti di impostarlo correttamente e scrivere alcuni test per verificare la correttezza del tuo codice.

+0

Sembra buono grazie! In termini Java/BigDecimal, questo si traduce in qualcosa di abbastanza brutto: price.divide (tick) .setScale (0, RoundingMode.HALF_UP) .multiply (tick) – Jon

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

// dove p = prezzo e t = tick incremento