为什么是myArrayList.size();产生不正确/巨大的数字?

时间:2013-04-15 20:29:21

标签: java for-loop arraylist binary

基本上,我正在尝试编写一个程序,将一个数字从基数2转换为基数10.我尝试做的是将本网站上列出的“加倍方法”下的过程转换为for循环,但对于某些因为我得到的数字是大的。

基本公式是(2 * previousTotal)+(保存用户输入的二进制数的ArrayList的currentDigit)= previousTotal。

因此,对于二进制的1011001,数学将是:

  • (0 x 2)+ 1 = 1
  • (1 x 2)+ 0 = 2
  • (2 x 2)+ 1 = 5
  • (5 x 2)+ 1 = 11
  • (11x 2)+ 0 = 22
  • (22 x 2)+ 0 = 44
  • (44 x 2)+ 1 = 89

然而,控制台打印出6185作为结果。我想它可能与我使用字符的ArrayList有关,但是charWhole.size()返回7,这是用户的二进制数中有多少位数。我一做charsWhole.get(w);然而,我开始得到像49这样的大数字。我真的很感激一些帮助!

我写了这个循环,并根据我在整个代码中放置的一些打印语句和我的变量addThis似乎是问题所在。控制台打印出最终总数为6185,而基数10中的1011001实际为89。

public static void backto2(){
    System.out.println("What base are you coming from?");
    Scanner backToB10 = new Scanner(System.in);
    int bringMeBack = backToB10.nextInt();

    //whole
    System.out.println("Please enter the whole number part of your number.");
    Scanner eachDigit = new Scanner(System.in);
    String theirNumber = eachDigit.nextLine();

    String str = theirNumber;
    ArrayList<Character> charsWhole = new ArrayList<Character>();
    for (char testt : str.toCharArray()) {
      charsWhole.add(testt);
    }



    System.out.println(theirNumber); // User's number
    System.out.println(charsWhole); // User's number separated into elements of an ArrayList
    System.out.println(charsWhole.size()); // Gets size of arrayList, comes out as 7 which seems fine.

    int previousTotal = 0, addThis = 0, q =0;
    for( int w = 0; w < charsWhole.size(); w ++) {
        addThis = charsWhole.get(w); //current digit of arraylist PROBLEM           
        q = previousTotal *2;
        previousTotal = q + addThis; // previous total gets updated
        System.out.println(q);
        System.out.println(addThis);

        System.out.println(q + " and " + addThis + "equals " + previousTotal);


    }

    System.out.println(previousTotal);

3 个答案:

答案 0 :(得分:6)

您正在尝试将字符添加到整数。隐式转换使用字符的ASCII值,因此'1'转换为49而不是1,因为49是字符'1'的代码。减去'0'以获得实际的整数值。

addThis = charsWhole.get(w) - '0';

这是有效的,因为数字0-9用ASCII表示为代码48-57,所以实际上你将为'1'减去49 - 48得到1。

当角色超出允许的字符范围时,你仍然需要处理案件。

修改

Java使用Unicode,但出于数字0-9的代码的目的,ASCII和Unicode中的代码相同(48到57或0x30到0x39)。

答案 1 :(得分:1)

问题是你使用的是字符而不是它们代表的数字值。在行

addThis = charsWhole.get(w);

addThis的值是字符的ascii值。对于'0',这是48.改为使用:

addThis = Integer.parseInt(charsWhole.get(w)); 

答案 2 :(得分:0)

解决同样问题的另一个建议是:

addThis = charsWhole.getNumericValue(w);

有关详细信息,请参阅here