2

バックグラウンド:

クラス割り当て用の単純な基本コンバーターを作成しています。私はかなり完成に近づいていますが、変換アルゴリズムを整理して、ユーザーが入力した値 (特定の基数) を基数 10 の値に変換する必要があります。

試み:

import java.util.Scanner;

public class BaseConverter {
public static void main(String[] args) {
    String numIn, intro1, prompt1, prompt2, output1;
    int baseIn;
    double numOut;
    boolean flag = true;
    Scanner kb = new Scanner(System.in);

    intro1 = "This program converts values in different number bases to a decimal value.";
    prompt1 = "Type in a number base (2 - 9): ";

    while (flag == true){
        System.out.println(intro1);
        System.out.println(prompt1);
        baseIn = kb.nextInt();
        //Checking base value for outliers outside given range
        if (baseIn < 2 || baseIn > 9) {
            System.out.println("Base must be between 2 and 9");
            System.exit(1);
        }
        prompt2 = "Type in a base "+baseIn+" number: ";
        System.out.println(prompt2);
        numIn = kb.next();

        // System.out.println(numStore);
        int counter = 0;
        // Let's pretend baseIn is 3 and i starts at 3 
        for (int i = numIn.length(); i >= 1; i--){
            numOut = (numIn.charAt(i-1) * Math.pow(baseIn, counter++));
            System.out.println(numOut);
        }
    }//while
}// method
}//class

問題:

この行は期待値を返しません

numOut = (numIn.charAt(i-1) * Math.pow(baseIn, counter++));

たとえば、文字列 "10" の場合、for ループの最初の反復では、numOut は (0*(2*0)) またはゼロである必要があります。代わりに、48.0 を返します。

私の考え:

Math.pow() メソッドをデバッグすると、期待値が返されることが示されたので、charAt() メソッドに関係があるのではないかと疑っています。それがすべての異なる変数タイプと関係があるとしましょう。よくわかりません。

4

2 に答える 2

5

はい、あなたが正しいことcharAtが問題です。

たとえば「10」と入力すると、文字の整数値'0'は 48 になり、'1'Java が文字のエンコードに使用するエンコード テーブルによると 49 になります。

ここに画像の説明を入力

それを見ると、0 は として0x0030 = 3*16^1 = 48、1 は としてエンコードされていることがわかります0x0031 = 3*16^1 + 1*16^0 = 49

文字自体の数値を取得したい場合は、使用できます

numOut = Character.getNumericValue(numIn.charAt(i-1)) * Math.pow(baseIn, counter++);
于 2015-02-11T00:37:12.687 に答える
2

このcharAtメソッドは、char入力の を返します。この場合'0'は ではありません0。の Unicode 値は ではchar '0'なく048です。

幸いなことに、'0'~の値はそれぞれ'9'連続した Unicode 値で48あるため、乗算する前に減算57することで を「減算」できます。48'0'

numOut = ( (numIn.charAt(i-1) - '0') * Math.pow(baseIn, counter++));

ユーザーが入力したものが実際に選択した基数で有効な「数字」であることを検証する必要があります。

の値をnumOut合計して、最後に 10 進数の結果を取得することもできます。

于 2015-02-11T00:37:52.987 に答える