Java BigDecimalのオーバーフローの可能性のあるバグ
2023-08-09 22:29:56
質問
あるコードで境界条件をテストしていたのですが、そのコードには
BigDecimal
を含むコードの境界条件をテストしていました。
BigDecimal
が文字列で初期化されるとき
"1e2147483647"
で初期化された場合、予期せぬ振る舞いをします。の間の値を持っているようだ。
0
と
1e-2147483647
. を呼び出そうとすると
intValue()
を呼び出すと
NegativeArraySizeException
. 注意すべきは
2147483647
は私のシステム上の整数の最大値であることに注意してください。私は何か間違ったことをしているのでしょうか、それとも、この問題は
BigDecimal
?
BigDecimal test = new BigDecimal("1e2147483647");
test.compareTo(new BigDecimal(0)); //Returns 1
test.compareTo(new BigDecimal("1e-2147483647")); //Returns -1
test.intValue(); //Throws NegativeArraySizeException
どのように解決するのですか?
いいえ、あなたは正当なバグを持っているように見えます。このバグは JDK7 に存在しますが、JDK8 では修正されています。あなたの値は正しく
BigDecimal
として正しく表現でき、正しく動作するはずですが、そうではありません。
をトレースすると
のソースコードをたどると
BigDecimal
は、2585行目にある
this.precision()
が 1 であり
this.scale
は
-2147483647
.
this.precision() - this.scale
であるためオーバーフローし、以下のオーバーフローは正しく処理されません。
このバグ
は修正されました。
によって JDK8 では
で引き算をすることで
long
算術
.
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
SocketException java.netの4つの例外解決策。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
無効な文字定数
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
セミコロン期待値エラー解決
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Javaがテキストファイルを読み込む
-
Java基礎編 - オブジェクト指向
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.