Java で大きな数値を扱うときに乗算で予期しない結果が生じるのはなぜですか?

Linda Hamilton
リリース: 2024-11-06 17:27:02
オリジナル
357 人が閲覧しました

Why Does Multiplication in Java Produce Unexpected Results When Dealing with Large Numbers?

Java の乗算結果とデータ型について

Java では、乗算演算の結果はオペランドのデータ型によって異なります。これは、次のコード例に示すように、大きな値を乗算する場合に特に顕著です。

long oneYearWithL = 1000 * 60 * 60 * 24 * 365L;
long oneYearWithoutL = 1000 * 60 * 60 * 24 * 365;
System.out.println(oneYearWithL); // Output: 31536000000
System.out.println(oneYearWithoutL); // Output: 1471228928
ログイン後にコピー

説明:

  • oneyearWithL: 数値の末尾に「L」を追加することで、データ型を明示的にlongとして指定します。これにより、結果が 64 ビット長の整数に格納されるようになり、非常に大きな値を保持できるようになります。したがって、乗算の結果は正しく、3,153,600,000 ミリ秒 (または年) と等しくなります。
  • oneyearWithoutL: 'L' を省略すると、オペランドは 32 ビット整数として扱われます。これらの整数を乗算した結果は整数の範囲をオーバーフローし、不正な値になります: 1,471,228,928.

整数オーバーフローについて:

Java では、整数-2,147,483,648 ~ 2,147,483,647 の範囲の符号付き 32 ビット値です。算術演算の結果がこれらの境界を超えると、範囲の反対側に回り込み、整数オーバーフローが発生します。

この例では、1000 を乗算した結果 60 60 24 365 は 2,592,000,000 です。この値は最大整数値を超えているため、-1,702,967,297 にラップアラウンドされ、出力 (1,471,228,928) として表示されます。

Long データ型への変換:

整数のオーバーフローを防ぐために、大規模な数値計算にはlongデータ型を使用することを常にお勧めします。数値の後に「L」を明示的に指定することで、Java に値を長整数として扱うように強制でき、結果が 64 ビット長の変数に確実に格納されます。

ベスト プラクティス:

  • 大きな数値には、long データ型を使用します。
  • 潜在的な整数オーバーフローに注意し、必要に応じて、long または BigInteger を使用してください。
  • floating の使用を検討してください。 - 非常に大きな計算または小数計算のポイント番号。

以上がJava で大きな数値を扱うときに乗算で予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!