Округление Java BigDecimal до ближайшего интервала - PullRequest
15 голосов
/ 13 марта 2009

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

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

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

Спасибо.

Обновление: решение schnaader, переведенное на Java / BigDecimal:

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

Ответы [ 2 ]

13 голосов
/ 13 марта 2009

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

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;

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

1 голос
/ 06 декабря 2013
p= p - p % t + ((p % t < t / 2) ? 0.0 : t);

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

...