2009-03-13 3 views
15

У меня есть результат вычисления BigDecimal, который мне нужно округлить до ближайшего заданного интервала (в данном случае это размер размера финансового рынка).Округление Java BigDecimal до ближайшего интервала

например. Цена [Размер тика] -> Закругленная цена

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

Спасибо.

Update: решение schnaader, в переводе на Java/BigDecimal термины:

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

Для возможности поиска, эта техника может быть использованы для округления процентного значения до некоторой произвольной доли базисной точки. –

ответ

13

Вы можете нормализовать размер клеща, а затем использовать обычные методы округления:

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 

Так оно и должно быть:

Price = Round(Price/Tick) * Tick; 

Также обратите внимание, что вам, похоже, необходимо установить правильный режим округления для BigDecima левая сторона См. Например, BigDecimal Docs. Поэтому вы должны быть уверены, что установите это правильно и напишите несколько тестов, чтобы проверить правильность вашего кода.

+0

Выглядит хорошо! В Java/BigDecimal термины это приводит к довольно уродливому: price.divide (tick) .setScale (0, RoundingMode.HALF_UP) .multiply (tick) – Jon

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

// где р = цена и т = клещ приращение