Search code examples
javamathroundingbigdecimalfloating-accuracy

Set all BigDecimal operations to a certain precision?


My Java program is centered around high precision calculations, which need to be accurate to at least 120 decimal places.
Consequentially, all non-integer numbers will be represented by BigDecimals in the program.

Obviously I need to specify the accuracy of the rounding for the BigDecimals, to avoid infinite decimal expressions etc.
Currently, I find it a massive nuisance to have to specify the accuracy at every instantiation or mathematical operation of a BigDecimal.

Is there a way to set a 'global accuracy' for all BigDecimal calculations?
(Such as the Context.prec() for the Decimal module in python)

Thanks


Specs:
Java jre7 SE
Windows 7 (32)


Solution

  • (Almost) Original

    Not as simple, but you can create a MathContext and pass it to all your BigDecimal constructors and the methods performing operations.

    Revised

    Alternatively, you can extend BigDecimal and override any operations you want to use by supplying the right MathContext, and using the rounding version of 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 ) );
          }
          ...
    }