【问题标题】:Java/Scala BigInteger PastingJava/Scala BigInteger 粘贴
【发布时间】:2010-12-13 22:46:59
【问题描述】:

Java BigInteger 类有问题:我无法将大值粘贴到 BigInteger。例如,假设我想为这个号码分配一个BigInteger

26525285981219105863630848482795

我不能直接赋值,因为编译器认为它是一个整数:

val bi = 26525285981219105863630848482795 //compile error

但我希望它是BigInteger。有什么办法可以直接粘贴到源代码中?

如果没有这种方法,那么Scala中有没有一种方法,它有一个更容易使用的BigInt类?

【问题讨论】:

  • “编译器认为它是一个整数”是什么意思。编译器怎么会认为 30 位数字是 Integer
  • @oxbow - 我认为迈克尔的意思是 Scala 编译器认为文字是一个整数,然后抱怨“整数太大”。在 Scala 解释器中尝试 val a = 26525285981219105863630848482795 :)。

标签: java scala biginteger bigint


【解决方案1】:

Scala 3 开始,以及对numeric literals 的改进,您可以使用以下形式:

val big: BigInt = 26525285981219105863630848482795
// 26525285981219105863630848482795

甚至:

val big: BigInt = 26_525_285_981_219_105_863_630_848_482_795
// 26525285981219105863630848482795

【讨论】:

    【解决方案2】:

    rtperson 的answer 从 Java 的角度来看是正确的,但在 Scala 中,使用 scala.BigInts 比使用 java.math.BigIntegers 可以做的更多。

    例如:

    scala> val a = new BigInteger("26525285981219105863630848482795");
    a: java.math.BigInteger = 26525285981219105863630848482795
    
    scala> a + a
    :7: error: type mismatch;
    found   : java.math.BigInteger
    required: String
           a + a

    Scala 中实例化类的规范方法是使用位于 companion object。当您在 Scala 中编写 Foo(args) 时,它被转换为 Foo.apply(args),其中 Foo 是一个单例对象 - 伴生对象。因此,要找到构造 BigInts 的方法,您可以查看 Scala 库中的 BigInt 对象,特别是其 apply 构造。

    因此,构造BigInt 的三种方法是:传递IntLongString 以进行解析。示例:

    scala> val x = BigInt(12)
    x: BigInt = 12
    
    scala> val y = BigInt(12331453151315353L)
    y: BigInt = 12331453151315353
    
    scala> val z = BigInt("12124120474210912741099712094127124112432")
    z: BigInt = 12124120474210912741099712094127124112432
    
    scala> x + y * z
    res1: BigInt = 149508023628635151923723925873960750738836935643459768508
    

    请注意,您可以使用 BigInt 进行看起来自然的算术运算,而 BigInteger 则无法做到这一点!

    【讨论】:

      【解决方案3】:

      这应该有效:

      BigInteger bigInt = new BigInteger("26525285981219105863630848482795");
      

      BigInteger 读取字符串并将它们解析为正确的数字。因此,您需要查看 java.text.NumberFormat。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        相关资源
        最近更新 更多