我正在研究一个计算器,以便更好地学习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;
}
任何建议表示赞赏!谢谢。
答案 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