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)
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top