Search code examples
javaapfloat

How to convert Apfloat to BigDecimal?


I am using the following code where k is a BigDecimal:

Apfloat power = ApfloatMath.pow(new Apfloat(-1), new Apfloat(k));

Apfloat seems to have methods like intValue(), doubleValue(), floatValue() but I can't see how I can convert Apfloat to BigDecimal.


Solution

  • BigDecimals are best generated from Strings or using the BigDecimal.valueOf( double) static constructor.

    For your specific requirement, start with the following:

    public static asBigDecimal (Apfloat val) {
        return BigDecimal.valueOf( val.doubleValue());
    }
    

    Calling new BigDecimal(double) is specifically to be avoided, since it generates exact decimal representations of the floating-point bits & can somewhat unpredictably require vast numbers of decimal digits to do so.

    On the other hand, BigDecimal.valueOf( double) and Double.toString( double) have specific logic to represent doubles -> decimal without spurious deep decimalization.

    See:

    • java.math.BigDecimal.BigDecimal(double)

    Quoting from the Javadoc:

    The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.