質問

BigDecimalの計算結果があり、指定した最も近い間隔に丸める必要があります(この場合、金融市場のティックサイズです)。

e.g。価格[ティックサイズ]->四捨五入価格

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)
役に立ちましたか?

解決

ティックサイズを正規化してから、通常の丸め方法を使用できます。

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 をご覧ください。 。そのため、必ずこれを正しく設定し、コードの正確性を確認するためのテストを作成する必要があります。

他のヒント

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

// where p =価格、t =ティック刻み

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top