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

标签 java operator-overloading operators biginteger bigdecimal

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

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

谢谢

附注应该使用 BigInteger.add() 而不是++,我明白了。 BigInteger 的平方根怎么样?

最佳答案

BigInteger不可变的。这使得像++这样的东西- 运算符(operator)在概念上是不可能的。您无法更改给定 BigInteger 的值,就像你不能用 String 做到这一点一样.

递增

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

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

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

a = a.add(BigInteger.ONE);

请注意,这两行都不会更改 BigInteger 的值其中a原本指向。最后一行创建一个 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);
}

使用运算符而不是方法

C++那样的运算符重载在Java中是不可能的。

关于java - BigInteger 和 BigDecimal 的平方根和++ 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42204941/

相关文章:

c++ - C++ 指针运算符列表

Java - 奇怪的挂套接字?

java - 单个请求的 SOAP Web 服务保持 Activity 状态?

c++ - 关于此运算符重载的意见

python - 避免 numpy 为重载运算符分发操作

r - 什么!运算符在R中表示平均值,尤其是在!! sym (“x”上下文中)

java - 顶点 3.4 : Difference between running code immediately and context. runOnContext

java - 如何从诺基亚 S40 设备读取 RMS 文件?

c++ - 为什么在全局命名空间中使用 << 运算符是一个坏主意?

java - "?"和 ":"在 boolean 语句中做什么?