BigInteger和BigDecimal的平方根和++运算符

时间:2017-02-13 13:13:12

标签: java operator-overloading operators biginteger bigdecimal

是否有现成的Java库用于BigInteger和BigDecimal对象的操作?

我想使用平方根和++运算符。

谢谢

P.S。应该使用BigInteger.add()而不是++,我得到了它。 BigInteger的平方根怎么样?

1 个答案:

答案 0 :(得分:2)

BigInteger 不可变。这使得像++ - 操作符这样的操作在概念上是不可能的。您无法更改给定BigInteger的值,就像您无法使用String一样。

递增

您始终必须创建一个包含递增值的新BigInteger(您当然可以将该BigInteger的引用存储在同一个变量中)。

编辑:正如评论中所指出的,“递增”看起来像是:

BigInteger result = a.add(BigInteger.ONE);

a = a.add(BigInteger.ONE);

请注意,这两行都不会更改 BigInteger最初指向的a的值。最后一行创建了一个 new BigInteger,并将引用存储在a中。

计算平方

您可以像这样计算BigInteger的平方:

BigInteger a = BigInteger.valueOf(2);
BigInteger a_square = a.multiply(a); // a^2 == a * a

BigInteger a_square = a.pow(2);

平方根

代码取自https://gist.github.com/JochemKuijpers/cd1ad9ec23d6d90959c549de5892d6cb。 它使用简单的二分法和一个聪明的上界。请注意,a.shiftRight(x)相当于a / 2^x(仅适用于非负数,但无论如何,这都是我们处理的)

BigInteger sqrt(BigInteger n) {
    BigInteger a = BigInteger.ONE;
    BigInteger b = n.shiftRight(5).add(BigInteger.valueOf(8));
    while (b.compareTo(a) >= 0) {
        BigInteger mid = a.add(b).shiftRight(1);
        if (mid.multiply(mid).compareTo(n) > 0) {
            b = mid.subtract(BigInteger.ONE);
        } else {
            a = mid.add(BigInteger.ONE);
        }
    }
    return a.subtract(BigInteger.ONE);
}

使用运算符代替方法

在Java中无法像 C ++ 那样重载运算符。