charAt() 和 Math.pow()

Posted

技术标签:

【中文标题】charAt() 和 Math.pow()【英文标题】:charAt() and Math.pow() 【发布时间】:2015-04-11 05:49:23 【问题描述】:

背景:

我正在为班级分配制作一个简单的基础转换器。我已经接近完成,但需要整理转换算法以将用户输入的值(在给定的基数中)转换为以 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。

我的想法:

我偷偷怀疑它与 charAt() 方法有关,因为调试 Math.pow() 方法显示它返回预期值。假设它与所有不同的变量类型有关?我不确定。

【问题讨论】:

“字符”在 Java 中是一个数值,它告诉您可以在(当前用途)ASCII table 中的何处找到该字符。例如,字符“0”的值是十进制的 48。 (几乎所有编程语言中的“字符”都是如此。) (更完整的答案,很多人会坚持告诉我,这个值是一个UNICODE值。但是UNICODE的前128个字符本质上与ASCII相同,一个ASCII表就很多了更容易阅读。) java.lang.Long 有一个方法public static long parseLong(String s, int radix) 【参考方案1】:

是的,你是对的 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++);

【讨论】:

感谢您对此的详尽解释。当我实现给定的行时,抛出错误“字符类型中的方法 getNumericValue(char) 不适用于参数(双精度)”,有什么想法吗?建议的修复方法是强制转换 (char),但这并不能解决问题。 @jclark754 对不起,我混淆了括号(缺少一个),我刚刚编辑了答案。它现在应该可以按预期工作了。【参考方案2】:

charAt 方法返回您输入的char,在本例中为'0',而不是0char '0' 的 Unicode 值不是 0,而是 48

幸运的是,'0''9' 的值是连续的 Unicode 值,4857 分别是,因此您可以通过在相乘之前减去 '0' 来“减去”48

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

您仍然需要验证用户输入的内容实际上是所选基数中的有效“数字”。

您还需要将numOut 的值相加以得到最后的十进制结果。

【讨论】:

以上是关于charAt() 和 Math.pow()的主要内容,如果未能解决你的问题,请参考以下文章

Python问题 pow(x,y)和math pow(x,y的区别?

Python中**pow()和math.pow()的区别

ECMAScript 2016 求幂运算符和 Math.pow() 之间的区别

指数运算符 ^ 和 Math.pow() 之间的区别

如何在 jsp 中使用 Math.pow?

JavaScript中计算N次方的方法**和math.pow()-讲解