我正在为类分配制作一个简单的基本转换器。我相当接近完成但需要整理转换算法以将用户输入的值(在给定的基础中)转换为基数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++));
例如,在字符串&#34; 10&#34;中,numOut应该是(0 *(2 * 0))或在for循环的第一次迭代时为零。相反,它返回48.0。
我怀疑它与charAt()方法有关,因为调试Math.pow()方法显示它返回了预期的值。假设它与所有不同的变量类型有关?我不确定。
答案 0 :(得分:5)
是的,你是对的charAt
是问题所在。
当你输入let说“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++);
答案 1 :(得分:2)
charAt
方法会返回您输入的char
,在这种情况下为'0'
,而不是0
。 char
'0'
的Unicode值不是0
,而是48
。
幸运的是,'0'
到'9'
的值分别是连续的Unicode值,48
到57
,因此您可以“减去”48
在乘以之前减去'0'
。
numOut = ( (numIn.charAt(i-1) - '0') * Math.pow(baseIn, counter++));
您仍然需要验证用户输入的内容实际上是所选基地中的有效“数字”。
您还需要将numOut
的值一起添加到最后得到小数结果。