µL単位で液体の量を追跡しているアプリケーションがあります。現在、システム全体のボリュームの保存に「double」を使用していますが、ほとんどの場合、これは正常に機能します。ただし、これらのボリュームを多数加算および減算し始めると、さまざまな累積エラーが忍び寄り始めます。エラーの大きさは非常に小さいですが、しきい値の比較で問題が発生し、突然ボリュームがごくわずかな量で予想よりも小さくなります。検証の失敗を引き起こします。これは、浮動小数点演算の累積を実行する際のかなり一般的な問題であることを理解していますが、この問題にどのように対処するのが最善か疑問に思っています。私が持っていたいくつかの考え:
すべての二重参照を整数に置き換え、代わりにすべてをnLで追跡できます。これは間違いなく問題を解決しますが、それは非常に侵襲的な変更です。このシステムはまだ実稼働環境で使用されていません。つまり、後で適用するよりも、今すぐ適用する方がはるかに簡単です。
doubleの代わりにDecimalを使用できます。これは整数に変更するよりも侵襲的ではありませんが、それでもかなり重要な変更が必要です。
すべてのボリューム比較で、指定されたエラー許容度を考慮に入れるように要求できます。これは主に私が現在行っていることですが、比較コードが醜くなり、パターンの適用を忘れないようにするためにコードレビューが必要になります。
エラーの蓄積を防ぐために、各計算の後に指定された許容誤差への丸めを実行できます。これにより比較がより明確になりますが、割り当てがある場合はどこでも同様の問題が発生します。
この問題にも苦労している人にとって、どのソリューションが最もクリーンに実装できるのでしょうか。累積計算を実行するときに知っておくべき他の落とし穴はありますか?