编写自定义代码来计算BigDecimal权限

时间:2014-08-05 19:16:57

标签: java bigdecimal exponential

我正在研究一个计算器,以便更好地学习Java。我编写了自己的代码来计算BigDecimal参数的功效。截至目前,代码无法处理分数幂,例如2^2.2。为了解决这个问题,我想在我的代码中实现指数标识X^(A+B)=X^A*X^B

如何确定我的BigDecimal参数op2是否在小数点右边有数字,然后确定该值是什么?例如,代码将识别op2 = 2.2 = 2.0 + 0.2

我知道BigDecimal的scale()函数,但我不确定它是如何工作的。例如,

BigDecimal bd = new BigDecimal(2.1);
System.out.println(bd.scale());
> 51
BigDecimal bd = new BigDecimal(2.2);
System.out.println(bd.scale());
> 50

以下是计算权力的当前代码:

public static BigDecimal power(BigDecimal op1, BigDecimal op2)
{  
    boolean isOp1Zero;
    if (op1.compareTo(new BigDecimal(0)) == 0)
        isOp1Zero = true;
    else
        isOp1Zero = false;

    int distFromZero = op2.compareTo(new BigDecimal(0));

    //x^0 = 1
    if (distFromZero == 0)
        return new BigDecimal(1);

    //0^positive = 0
    else if (isOp1Zero && distFromZero == 1)
        return new BigDecimal(0);

    //non-zero^positive
    else if (!isOp1Zero && distFromZero == 1)
    {
        BigDecimal power = op1;
        for (int i = 1; i < op2.intValueExact(); i++)
        {
            power = power.multiply(op1);
        }

        return power;
    }

    //0^negative undefined
    else if (isOp1Zero && distFromZero == -1)
        throw new IllegalArgumentException("Error - zero to negative power");

    //non-zero^negative
    else if (!isOp1Zero && distFromZero == -1)
    {
        BigDecimal power = op1;
        BigDecimal op2NoSign = op2.multiply(new BigDecimal(-1));
        for (int i = 1; i < op2NoSign.intValueExact(); i++)
        {
            power = power.multiply(op1);
        }

        return new BigDecimal(1).divide(power);
    }
    return null;
}

任何建议表示赞赏!谢谢。

2 个答案:

答案 0 :(得分:1)

您可以查看使用bd.remainder(BigDecimal.ONE)

BigDecimal fraction = bd.remainder(BigDecimal.ONE)
BigDecimal whole = bd.subtract(fraction)

这适用于正大小数。

顺便说一下,我不知道这对你有什么帮助。你如何计算X^0.4? (也就是说,不使用对数)

答案 1 :(得分:1)

您应该使用BigDecimal.valueOf()作为开始。

BigDecimal bd = BigDecimal.valueOf(2.1);
b.scale() === 1

接下来你应该弄清楚你的目标是什么。除非您需要超过15位数的精度,否则使用double会更简单。但是,如果您需要更高的准确性,则应使用库来使用BigDecimal进行计算。例如如果你使用Math.pow()就浪费了你的时间。

要计算功率,a ^ b = exp(log(a)* b)看一下这个例子Logarithm of a BigDecimal