我们处理最多15位数的情况。我们需要从文本文件中解析这个值,通过C将它存储在Informix表中。还有另一个Java组件读取这些值,进行数学运算并计算结果。
我一直在对此进行一些研究,发现Informix提供的int8数据类型将是C的合适候选者。
关于Java,我计划使用BigInteger类。
采取这种方法是否有任何陷阱。任何想法都表示赞赏。
仅为了您的信息,这是一个旧的应用程序,它到目前为止一直在使用原语。此外,它只能处理基元范围内的数字。
感谢。
答案 0 :(得分:4)
只要您的所有数字(包括计算)都保持在15位数以下,长基元就是完全有效的选择,它具有性能和运算符的优势。 BigInteger的缺点实际上是数学的冗长/难度,你必须始终使用方法(Java中没有运算符重载,对象上唯一的运算符是+用于字符串连接)。
就性能而言,在不了解您的应用程序的情况下我不能说,但第一个假设应该是使用BigInteger,直到您另外测量。
答案 1 :(得分:2)
如果您的“巨大”数字最多为15位十进制数,那么long
可能是一个选项。 Java long
类型的范围为-2**63 to +2**63 - 1
。而2 ** 63是19位十进制数......如果我可以计算: - )。
如果当然,如果您的计算的任何中间结果是19位或更多,long
将不起作用,您可能需要使用BigInteger。
使用BigInteger没有特别的缺陷,除了它们明显慢于原始整数类型......并且更详细。实际上,它们的优势在于您不必再担心整数溢出。
答案 2 :(得分:1)
如果您的Informix版本支持BIGINT和BIGSERIAL,请优先使用它们而不是INT8和SERIAL8。由于各种复杂的原因,INT8和SERIAL8实际占用磁盘上的10个字节; BIGINT和BIGSERIAL支持相同的值范围,但只占用磁盘上的8个字节。
如果您的Informix版本不支持BIGINT和BIGSERIAL,请考虑升级到IDS 11.50。
如果Informix JDBC驱动程序仅支持INT8,则无论如何都要使用INT8。
答案 3 :(得分:0)
如果我理解正确,你会读到“小”值(适合INT8 integers),然后在Java中进行计算,你得到“大”值作为结果;对不对?
只要您不尝试将BigInteger值压缩到INT8数据类型中,它对我来说就好了。
正如Stephen C已经指出的那样,Java的long类型也有64位宽,所以这也适用。
答案 4 :(得分:0)
在C(C99,具体)中,long long
类型是64位有符号二进制整数,因此它最多可以容纳18位数。
在Java中,long
类型是等效类型,是64位带符号的二进制整数。
答案 5 :(得分:0)
如果您只是使用C来解析文本文件中的这些值,然后将它们运送到其他地方,那么您应该能够将它们保存为字符串。如果不自己动手,你将无法进行任何类似数学的操作,但是根据你的描述,你不需要这样做。
花时间找到二进制表示,或者可以对这些数字进行数学运算的库是没有意义的,如果他们对C程序的所有数据都是15位字符串。