为什么 charAt 的工作方式因打印的数据类型而异

Why does charAt work differently depending on the data type it is printed as

public class MyClass 
{
    public static void main(String args[]) 
    {
        String a = "(4 + 4i)";
        String b = "(2 + 3i)";
        int g = 1;
        int c = a.charAt( g ); // sets c to 52
        System.out.println( c ); // prints 52
        System.out.println( (double) a.charAt( g ) ); // prints 52.0
        System.out.println( a.charAt( g ) ); // prints 4
        System.out.println( 2 * a.charAt( g ) ); // prints 104
    }
}

我试图编写代码来乘以虚数,这就是为什么我在字符串中有 "i" 的原因。所以我想先取然后转换为 int 或 double。这给了我 52 这让我感到困惑。但是,当我直接打印到控制台时,它可以工作,但只是没有双重打印。这是没用的,因为我需要在其他地方使用它。那么这里发生了什么?尝试解析字符串 a 的部分并解析为 int 或 double 是否更好,是否有其他方法可以在不使用解析的情况下处理字符串中的数字?是否有可以处理虚数的方法,即 "e^pi * i = 1"?

字符串是一系列符号,例如字母、标点符号和数字,称为字符。每个字符都与一个数字相关联。一种常见的方法是使用所谓的 ASCII 字符。在本例中,您会看到字符 '4' 由数字 52.

表示

考虑到这一点,让我们看一下您的一些代码:

int c = a.charAt( g );

这一行默默地将字符转换为其数值。 "numerical value" 我的意思是表示字符的数字,而不是数字本身的值。在这种情况下,字符 '4' 的数值为 52.

System.out.println( a.charAt( g ) ); // prints 4

这会打印出 字符 '4',而不是 int 4。了解数字字符与其整数值之间的区别非常重要。

为了得到数字4以便进行算术运算,必须解析String。函数 Integer.valueOf() 对此有很大帮助。

您还应该了解 classes 和对象。例如,您可以创建一个 Complex class,这将允许您将复数用作具有其自身操作的单个实体。

要获得所需的数值,您需要使用 Integer.valueOf()Double.valueOf(),具体取决于您想要 int 还是 double

int c = Integer.valueOf(a.charAt(g))

如果你想允许多位数或小数点的数字,你将需要使用更复杂的解析方法。

你得到 52 因为 '4' 的 ascii 值是 52.

System.out.println("(4 + 4i)".charAt(1) == '4'); // '4' == '4'
System.out.println((int) '4'); // <-- 52

如果要将 char 转换为它的 int 值,您需要检查它是否在预期范围内,然后对其进行解析。您可以从值中减去 '0',或使用 Character.digit - 如

char c = '4';
if (c >= '0' && c <= '9') {
    System.out.println((int) (c - '0'));
    System.out.println(Character.digit(c, 10));
}

最后,System#out is a PrintStream,它提供重载方法来编写 int(或 char,或 String,或 double等)。