charAt() 和 Math.pow()
charAt() and Math.pow()
背景:
我正在为 class 作业制作一个简单的基础转换器。我相当接近完成,但需要整理转换算法以将用户输入的值(在给定的基数中)转换为基数 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
问题:
此行不return预期值
numOut = (numIn.charAt(i-1) * Math.pow(baseIn, counter++));
例如,在字符串“10”中,numOut 在 for 循环的第一次迭代中应为 (0*(2*0)) 或零。相反,它 returns 48.0.
我的想法:
我暗暗怀疑它与 charAt() 方法有关,因为调试 Math.pow() 方法显示它 returning 预期值。假设它与所有不同的变量类型有关?我不确定。
是的,你是对的 charAt
就是问题所在。
当您键入“10”时,字符 '0'
的整数值为 48,而 '1'
根据编码 table 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++);
charAt
方法 returns 您输入的 char
,在本例中为 '0'
,而不是 0
。 char
'0'
的 Unicode 值不是 0
,而是 48
.
幸运的是,值 '0'
到 '9'
是连续的 Unicode 值,分别是 48
到 57
,所以你可以 "subtract" 出 48
通过在乘法之前减去 '0'
。
numOut = ( (numIn.charAt(i-1) - '0') * Math.pow(baseIn, counter++));
您仍然需要验证用户键入的内容实际上是所选库中的有效 "digit"。
您还需要将 numOut
的值相加以获得末尾的小数结果。
背景:
我正在为 class 作业制作一个简单的基础转换器。我相当接近完成,但需要整理转换算法以将用户输入的值(在给定的基数中)转换为基数 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
问题:
此行不return预期值
numOut = (numIn.charAt(i-1) * Math.pow(baseIn, counter++));
例如,在字符串“10”中,numOut 在 for 循环的第一次迭代中应为 (0*(2*0)) 或零。相反,它 returns 48.0.
我的想法:
我暗暗怀疑它与 charAt() 方法有关,因为调试 Math.pow() 方法显示它 returning 预期值。假设它与所有不同的变量类型有关?我不确定。
是的,你是对的 charAt
就是问题所在。
当您键入“10”时,字符 '0'
的整数值为 48,而 '1'
根据编码 table 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++);
charAt
方法 returns 您输入的 char
,在本例中为 '0'
,而不是 0
。 char
'0'
的 Unicode 值不是 0
,而是 48
.
幸运的是,值 '0'
到 '9'
是连续的 Unicode 值,分别是 48
到 57
,所以你可以 "subtract" 出 48
通过在乘法之前减去 '0'
。
numOut = ( (numIn.charAt(i-1) - '0') * Math.pow(baseIn, counter++));
您仍然需要验证用户键入的内容实际上是所选库中的有效 "digit"。
您还需要将 numOut
的值相加以获得末尾的小数结果。