【问题标题】:BigInteger or not BigInteger?BigInteger 还是不是 BigInteger?
【发布时间】:2010-05-05 20:07:32
【问题描述】:

在 Java 中,大多数原始类型都是有符号的(一位用于表示 +/-),因此当我超出类型的限制时,我会得到意想不到的结果,比如负数。

有没有比使用 BigInteger 更好的解决方案,因为 BigInteger 存在性能问题,并且您需要使用类方法来进行基本算术而不是语言运算符(破坏可读性)?

【问题讨论】:

  • 为什么你认为你会超过一个有符号的 64 位长度?你用数字代表什么?

标签: java biginteger


【解决方案1】:

不,没有更好的解决方案。如果您使用的值不能放入 long 或 double 中,那么您将需要使用像 BigInteger 这样的引用类型,并且 Java 不支持运算符重载。

从技术上讲,我想您可以在有符号值和无符号值之间进行一些映射,但如果您的目标是干净简单的代码,那么这根本不是可行的方法。

【讨论】:

  • +1 "将漂亮的代码转换为使用 BigInteger 非常令人沮丧" 你漂亮的代码展示了所涉及的值的数量级以及数据类型的限制。很少有实际用例会溢出长(64 位有符号整数),这些应该是可识别的。
  • long 和 BigInteger 之间应该有一些东西。 BigInteger 太庞大了。
  • 其实BigInteger并不是很笨重。任何“中间”类型都不会更轻量级。
【解决方案2】:

Scala 确实是这里的解决方案。在那种语言中,“运算符”实际上只是固定方法,可以为任意类定义。实际上,在您的情况下,它们已经在标准库中。因此,您可以拥有特殊数字表示的强大功能,同时拥有 Java 原始类型的简洁语法。

Scala 久经沙场,可与您的 Java 代码完全互操作。

【讨论】:

  • Groovy 也是同样的选择。
  • 是的,Scala 是实现这一目标的脚本语言的一个很好的例子,特别是因为它可以编译为原生 Java 字节码!
【解决方案3】:

仍然拥有漂亮的业务逻辑的唯一方法是使用脚本语言,您可以将其编译为 java 类。然后你可以在内部使用 BigIntegers。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多