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

あなたの「巨大な」数字がせいぜい10進数で15桁の場合、それlongはオプションかもしれません。Javalong型には range があります-2**63 to +2**63 - 1。そして、2**63 は 19 桁の 10 進数です ... 数えることができれば :-)。

もちろん、計算の中間結果のいずれかが 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 ビットの符号付き 2 進整数であるため、最大 18 桁まで保持できます。

Java では、long型は同等の型であり、64 ビットの符号付き 2 進整数です。

于 2009-10-14T14:32:15.390 に答える
0

C を使用してこれらの値をテキスト ファイルから解析し、別の場所に送信する場合は、それらを文字列として保持できるはずです。独自のロールを作成せずに数学のような操作を実行することはできませんが、説明からすると、その必要はありません。

2 進表現や、これらの数値を計算できるライブラリを探すのに時間を費やしても、C プログラムにとって 15 桁の文字列しかない場合は意味がありません。

于 2009-10-14T14:36:43.790 に答える