ユーザが定義した計算式(有理数の四則演算のみ)を解析し、BigDecimalを使って計算するプログラムを作っています。
ここで、「計算結果は、小数点以下2桁までが、手計算での結果と一致することを保証する」という要求仕様があります。
正確には、「手計算で小数点以下第3位を四捨五入した値」との一致です。

BigDecimaldivideメソッドは、scaleの指定がありますが、上記の結果を保証するためには、都度の除算において、scaleにどのような値を指定すれば良いのでしょうか?
あるいは、根本的に保証できないのでしょうか?

結論が出ないながらも、自分で考えたことを挙げておきます。

  • 「小数点以下第3位を四捨五入」という操作が最後にあるので、結局は3桁目まで正しい状態を維持しなければならない
  • divideに対してscale=3を指定したとしても、1/3=0.333を3000倍すると999になってしまう。小数点以下何桁の保証どころではない。
    • (1/3)*30003000*1/3に組み替えるようなことをしないと、根本的に保証できない?
    • あるいは、「十分に大きなscaleを指定しておく」という方針?
    • 例えばscale=6としたとき、1/3=0.333333、これを3000倍で999.999となる。小数点以下第3位を四捨五入すれば、1000になる。
    • 「十分に大きなscale」とは何か? 具体的な値を定義できるか?

【追記】

  • 「このような計算式なら精度を保証できる」という制限付き仕様は実現可能か?
    • (a + b) / (x * y)のように、「除算が高々1回」かつ「除算が最後に実行される形」であれば良い?