1

私は小さな Java プログラムに取り組んでいますが、どこかで計算がうまくいきません。私のコードは次のとおりです。

import java.io.*;
import java.util.*;
import java.text.*;

public class NumManip
{

    public static void main(String args[])
    {

        Scanner numGetter = new Scanner(System.in);
        final int MULT_1 = 9;
        final int MULT_2 = 12345679;
        final int MULT_3 = 1000;
        int poorHatedNumber;

        System.out.print("Enter a digit between 1 and 9 that you dislike: ");
        poorHatedNumber = numGetter.nextInt();
        int num1 = poorHatedNumber * MULT_1, num2 = num1 * MULT_2;
        long num3 = num2 * MULT_3;

        System.out.println();

        System.out.println("           " + poorHatedNumber);
        System.out.println("          " + "x" + MULT_1);
        System.out.println("          __");
        System.out.println("          " + num1);
        System.out.println("   x" + MULT_2);
        System.out.println("          __");
        System.out.println("   " + num2);
        System.out.println("       x" + MULT_3);
        System.out.println("____________");
        System.out.println(num3);

    }

}

画面に num1、num2、および num3 を出力して問題を確認してみました。num1 は正しく、num2 は正しく、num3 は異常です。私の入力は 9 で、最初の計算では 9 を掛けて 81 を取得します。次に、12345679 を掛けて 999999999 を取得し、次に 1000 を掛けて -727380968 を取得します。その最後のステップの何が問題になっていますか? 私はJavaが初めてで、問題がわかりません。

4

4 に答える 4

1

999999999 * 12345679 = 1.234567898765432e+16 これは an の最大値int2,147,483,647よりもかなり大きい

Java は2-compliment メソッドを使用して int 数値を格納するため(数値が負の場合は左端のビットがオンになることを意味します)、この計算はそのビットに「オーバーフロー」(キャリーオーバー) し、負の結果になります。

このような大きな数値の計算には、BigDecimalを使用する必要があります

于 2013-09-22T17:12:53.517 に答える
0

num2 と num1 は両方とも整数であるため、整数乗算が発生し、整数値の最大値を超えています。

long num3 = (long)num2 * MULT_3;
于 2013-09-22T17:13:01.530 に答える
0

データ型が処理できるよりも大きな数値になっていると思います。データ型が署名されているため、負の値にラップします。

于 2013-09-22T17:13:07.470 に答える
0

心配しないでください。本当にばかげた間違いではありません。「数字は通常固定サイズです」という全体的な取り決めは、最初はほぼすべての人を混乱させます。何が起こっているかがわかったので、さらに奇妙なことがあります。これは実際にはあなたの質問に対する答えではありませんが、「悪いオーバーフロー」の例を見たので、これは興味深いと思うかもしれません。

奇数を考えてみましょうx。という数がありyますx * y == 1。その数y剰余乗法逆数と呼ばれ、簡単に計算できます (Hacker's Delight、定数による正確な除算を参照)。これは、本質的に、数が除数の正確な倍数である場合にのみ機能する奇妙な種類の「除算」を許可し、一般に、奇数による乗算を「元に戻す」ことができるため、直感に反するように思えるかもしれません。たとえば、 がある場合a = 3 * bb = -1431655765 * a- どちらの乗算のオーバーフローにも関係なく、オーバーフローは「破壊的」である必要はありません。

于 2013-09-22T17:33:19.183 に答える