Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算没有整数的幂?_Java_Bigdecimal - Fatal编程技术网

Java 如何计算没有整数的幂?

Java 如何计算没有整数的幂?,java,bigdecimal,Java,Bigdecimal,试图计算(a+b)^n,其中n是BigDecimal变量中的实值,但BigDecimal.pow设计为仅接受整数值。如果输入在double支持的幅度范围内,并且结果中不需要超过15个有效数字,请将(a+b)和n转换为double,使用Math.pow,然后将结果转换回BigDecimal。只要使用整数作为指数,就可以使用简单的循环来计算x^y: public static BigDecimal pow(BigDecimal x, BigInteger y) { if(y.compareT

试图计算(a+b)^n,其中n是BigDecimal变量中的实值,但BigDecimal.pow设计为仅接受整数值。

如果输入在double支持的幅度范围内,并且结果中不需要超过15个有效数字,请将(a+b)和n转换为double,使用Math.pow,然后将结果转换回BigDecimal。

只要使用整数作为指数,就可以使用简单的循环来计算x^y:

public static BigDecimal pow(BigDecimal x, BigInteger y) {
    if(y.compareTo(BigInteger.ZERO)==0) return BigDecimal.valueOf(1); //If the exponent is 0 then return 1 because x^0=1
    BigDecimal out = x;
    BigInteger i = BigInteger.valueOf(1);
    while(i.compareTo(y.abs())<0) {                                   //for(BigDecimal i = 1; i<y.abs(); i++) but in BigDecimal form
        out = out.multiply(x);
        i = i.add(BigInteger.ONE);
    }
    if(y.compareTo(BigInteger.ZERO)>0) {
        return out;
    } else if(y.compareTo(BigInteger.ZERO))<0) {
        return BigDecimal.ONE.divide(out, MathContext.DECIMAL128);    //Just so that it doesn't throw an error of non-terminating decimal expansion (ie. 1.333333333...)
    } else return null;                                               //In case something goes wrong
}

希望这有帮助

如果指数不适合整数,结果可能会非常大。@JanDvorak
2.1234
?@ArthurJulião显而易见的解决方案是将(a+b)和n转换为双精度,使用Math.pow,然后将结果转换回BigDecimal。这有两个限制:它只能处理两个量级范围内的数字,并且只能得到大约15个有效数字。以下哪一项适用于您的问题?@PeterLawrey,基础设施正在使用它,我接收到BigDecimal中的值,需要转换为BigDecimal以显示它。
public static BigDecimal powD(BigDecimal x, BigDecimal y) {
    return pow(x, y.toBigInteger());
}