私は金融アプリケーションを作成していますが、その中で常に倍精度を使用するか小数点を使用するかの判断に悩まされています。
私の計算はすべて、小数点以下 5 桁以下で、100,000 を超えない数値に対して有効です。いずれにしても、これらすべてを四捨五入の誤差なしで double として表すことができるのではないかという気がしますが、確信はありません。
明らかな速度上の利点のために、10 進数から倍精度数への切り替えを進めますが、結局のところ、価格を取引所に送信するために ToString メソッドを使用し、常に期待どおりの数値が出力されることを確認する必要があります。(89.99000000001 ではなく 89.99)
質問:
- 速度の利点は、単純なテストで示唆されるほど本当に大きいのでしょうか? (約 100 倍)
- ToString からの出力が希望どおりになることを保証する方法はありますか? これは、数値が常に表現可能であるという事実によって保証されますか?
更新: アプリを実行する前に約 100 億件の価格更新を処理する必要があり、保護上の理由から現在は 10 進数で実装していますが、起動するだけで約 3 時間かかります。doubles を使用すると、起動時間が大幅に短縮されます。doubles を使用して安全に実行する方法はありますか?
ベストアンサー1
- 浮動小数点演算はハードウェアによって直接サポートされているため、ほとんどの場合、大幅に高速になります。今のところ、広く使用されているハードウェアで 10 進演算をサポートしているものはほとんどありません (ただし、これは変更されています。コメントを参照してください)。
- 金融アプリケーションはいつも小数点数を使用すると、金融アプリケーションで浮動小数点数を使用することから生じる恐ろしい話は数え切れないほどあります。Google 検索でそのような例をたくさん見つけることができるはずです。
- 10 進演算は浮動小数点演算よりも大幅に遅くなる可能性がありますが、10 進データの処理にかなりの時間を費やさない限り、プログラムへの影響は無視できるほど小さい可能性があります。違いを心配する前に、常に適切なプロファイリングを行ってください。