【问题标题】:What are the limits of BigDecimal and BigInteger? [duplicate]BigDecimal 和 BigInteger 的限制是什么? [复制]
【发布时间】:2013-07-30 11:36:09
【问题描述】:

我在一个程序中将两个巨大的 BigInteger 值相乘。它失败了。 BigIntegerBigDecimal 的限制是什么?

【问题讨论】:

  • 你确定NumberFormatException出现在乘法过程中吗?你能显示你的代码吗?问题可能出在其他地方。
  • multiply 不会抛出 NumberFormatException。显示您的代码...
  • 我们真的应该立即删除有人报告异常而不发布堆栈跟踪的问题。不过,总比“失败”要好。

标签: java limit biginteger bigdecimal numberformatexception


【解决方案1】:

您不会得到 NumberFormatException 乘以大数。如果产生的数字太大,你会得到一个神秘的 NegativeArraySizeException 因为数组的大小溢出。

您更有可能遇到内存不足错误。

BigInteger 的限制是 32 * 2^32-1 位或大约 2^(40 亿)。

如果你这样做,你会得到一个 NumberFormatException

  • 从空字节创建 BigInteger[]
  • 使用符号 +1
  • 尝试解析基数 >36 或 的数字
  • 有一个包含非法数字的字符串。

当您遇到异常时,您还应该查看消息和堆栈跟踪,因为这通常会为您提供真正的原因。

【讨论】:

  • 这是否意味着您实际上可以拥有“负”数组索引?否则,它将是 2^31-1
【解决方案2】:

不应该有限制,除了内存,但可能有,根据类的实现(例如,某些字段可能是 int 或 long)。

【讨论】:

  • 正如彼得指出的那样,限制是间接限制,它由数组索引的类型产生:Int。因为 Big... 由 int[] 支持,所以您不能拥有像 88888888888888888888888888888888888 这样的索引。(但您之前可能会遇到 OutOfMemory)。
  • 是因为数组的最大项目数,即 RAM 内存(ok 除以 4,即 int 的大小)?想知道需要多少 RAM 才能容纳此数量。
  • 在具有 64 位地址空间的机器上,您可以拥有一个大小为 2^62 的 int 数组。 (仅此而已)但早在此限制之前,Java 就开始了,因为您不能使用 long 来索引数组。
  • 所以执行限制是彼得写的(因为负数,他将其减少了 1)?
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多