Completando um Java BigDecimal para o intervalo mais próximo
-
22-07-2019 - |
Pergunta
Eu tenho um resultado de cálculo BigDecimal que eu preciso para arredondar para o intervalo especificado mais próximo (neste caso é o tamanho carrapato mercado financeiro).
por exemplo. Price [Tamanho Tick] -> Arredondado Preço
100.1 [0.25] -> 100
100.2 [0.25] -> 100.25
100.1 [0.125] -> 100.125
100.2 [0.125] -> 100.25
Graças.
Update: A solução da schnaader, traduzido em Java termos / BigDecimal:
price = price.divide(tick).setScale(0, RoundingMode.HALF_UP).multiply(tick)
Solução
Você poderia normalizar carrapato tamanho e, em seguida, usar os métodos de arredondamento habitual:
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
Por isso, deve ser:
Price = Round(Price / Tick) * Tick;
Observe também que você parece ter para definir o modo de arredondamento correto para BigDecimals. Consulte BigDecimal Docs por exemplo . Então você deve ter certeza de definir esta correta e escrever alguns testes para verificar a exatidão de seu código.
Outras dicas
p= p - p % t + ((p % t < t / 2) ? 0.0 : t);
// onde p = preço e t = carrapato incremento