1

我们处于处理最多 15 位数字的情况。我们需要从一个文本文件中解析这个值,通过 C 将它存储在 Informix 表中。还有另一个 Java 组件读取这些值、进行数学运算并计算结果。

我对此进行了一些研究,发现 Informix 提供的 int8 数据类型将是 C 的合适候选者。

关于 Java,我打算使用 BigInteger 类。

采用这种方法是否有任何陷阱。任何想法表示赞赏。

仅供参考,这是一个旧应用程序,到目前为止它一直在使用原语。此外,它只能处理基元范围内的数字。

谢谢。

4

6 回答 6

4

只要你所有的数字(包括计算)都保持在 15 位以下,长原语是一个完全有效的选择,它具有性能和运算符的优势。BigInteger 的缺点确实是做数学的冗长/困难,你必须一直使用方法(Java 中没有运算符重载,唯一适用于对象的运算符是 + 用于字符串连接)。

在性能方面,如果不了解您的应用程序的更多信息,我不能说,但第一个假设应该是使用 BigInteger 是可以的,除非您进行其他测量。

于 2009-10-14T14:07:58.520 回答
2

如果您的“巨大”数字最多为 15 位十进制数字,那么long可能是一种选择。Javalong类型有 range -2**63 to +2**63 - 1。而 2**63 是 19 位十进制数字......如果我能数数:-)。

当然,如果您的计算的任何中间结果为 19 位或更多位,long则将不起作用,您可能需要使用 BigInteger。

使用 BigInteger 没有特别的缺陷,除了它们比原始整数类型慢得多……而且更冗长。事实上,它们的优点是您不必再担心整数溢出。

于 2009-10-14T13:47:01.013 回答
1

如果您的 Informix 版本支持 BIGINT 和 BIGSERIAL,请优先使用它们而不是 INT8 和 SERIAL8。由于各种复杂的原因,INT8 和 SERIAL8 实际上在磁盘上占用了 10 个字节;BIGINT 和 BIGSERIAL 支持相同范围的值,但只占用磁盘上的 8 个字节。

如果您的 Informix 版本不支持 BIGINT 和 BIGSERIAL,请考虑升级到 IDS 11.50。

如果 Informix JDBC 驱动程序只支持 INT8,那么无论如何都要使用 INT8。

于 2009-10-14T18:12:45.773 回答
0

如果我理解正确,您可以读取“小”值(适合INT8 整数),然后在 Java 中进行计算,得到“大”值作为结果;对?
只要您不尝试将 BigInteger 值压缩到 INT8 数据类型中,它对我来说就很好。
正如 Stephen C 已经指出的,Java 的 long 类型也有 64 位宽度,所以这也可能是合适的。

于 2009-10-14T13:41:48.003 回答
0

在 C(具体来说是 C99)中,long long类型是 64 位有符号二进制整数,因此它最多可以容纳 18 位数字。

在 Java 中,long类型是等效类型,即 64 位有符号二进制整数。

于 2009-10-14T14:32:15.390 回答
0

如果您只是使用 C 从文本文件中解析这些值,然后将它们发送到其他地方,您应该能够将它们保存为字符串。如果不自己动手,您将无法进行任何类似数学的运算,但根据您的描述,您不必这样做。

如果 C 程序中的所有数字都是 15 位字符串,那么花时间寻找二进制表示或可以对这些数字进行数学运算的库是没有意义的。

于 2009-10-14T14:36:43.790 回答