将所有BigDecimal操作设置为一定的精度?

Ant*_*rth 12 java math rounding floating-accuracy bigdecimal

我的Java程序以高精度计算为中心,需要精确到至少120个小数位.
因此,所有非整数都将由程序中的BigDecimals表示.

显然,我需要为BigDecimals指定舍入的准确性,以避免无限的十进制表达式等.
目前,我发现必须在BigDecimal的每个实例化或数学运算中指定精度是一个巨大的麻烦.

有没有办法为所有BigDecimal计算设置"全局准确度"?
(比如python中Context.prec()Decimal模块)

谢谢


规格:
Java jre7 SE
Windows 7(32)

tru*_*ity 11

(差不多)原创

不是那么简单,但您可以创建一个MathContext并将其传递给所有BigDecimal构造函数和执行操作的方法.

修订

或者,您可以BigDecimal通过提供权限MathContext并使用以下的舍入版本来扩展和覆盖您要使用的任何操作divide:

public class MyBigDecimal extends BigDecimal {

      private static MathContext context = new MathContext(120, RoundingMode.HALF_UP);

      public MyBigDecimal(String s) {
           super(s, context);
      }
      public MyBigDecimal(BigDecimal bd) {
           this(bd.toString()); // (Calls other constructor)
      }
      ...
      public MyBigDecimal divide( BigDecimal divisor ){
           return new MyBigDecimal( super.divide( divisor, context ) );
      }
      public MyBigDecimal add( BigDecimal augend ){
           return new MyBigDecimal( super.add( augend ) );
      }
      ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我想要避免的。 (2认同)
  • 不幸的是,如果你想使用`number.divide(otherNumber);`语法,你仍然需要对构造函数进行超类,因为你需要`number`是`MyBigDecimal`而不是`BigDecimal`.另一个选择是忘记子类化并写一个`静态BigDecimal除法(BigDecimal a,BigDecimal b){a.divide(b,context);};`函数并使用它而不是提供的那个. (2认同)