将所有 BigDecimal 运算设置为一定的精度?

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

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

有没有办法为所有BigDecimal计算设置“全局精度”?
(例如python中的十进制模块)Context.prec()

谢谢


产品规格数据:
Java jre7 SE
视窗 7 (32)


答案 1

(几乎)源语言

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

修订

或者,您可以通过提供正确的操作来扩展和覆盖要使用的任何操作,并使用 的舍入版本:BigDecimalMathContextdivide

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 ) );
      }
      ...
}

答案 2

创建一个类,其静态工厂方法与所有接受的构造函数匹配 - 除了实例位于工厂内部并在启动时静态初始化。下面是一个片段:BigDecimalFactoryMathContextMathContext

public class BigDecimalFactory {
    public static BigDecimal newInstance (BigInteger unscaledVal, int scale) {
        return new BigDecimal (unscaledVal, scale, _mathContext);
    }

    // . . . other factory methods for other BigDecimal constructors

    private static final MathContext _mathContext = 
        new MathContext (120, BigDecimal.ROUND_HALF_UP);
}