Java中charAt()返回的是字符的Unicode码点(如'0'对应48),而非字符本身表示的数字;若需获取数字值,应通过Character.digit()或Integer.parseInt()等方式显式转换。
java中`charat()`返回的是字符的unicode码点(如'0'对应48),而非字符本身表示的数字;若需获取数字值,应通过`character.digit()`或`integer.parseint()`等方式显式转换。
在实现类似阿姆斯特朗数(Armstrong number)判断的逻辑时,一个常见误区是直接将 String.charAt(i) 赋值给 int 变量,误以为会得到数字 0–9 的整数值。实际上,charAt() 返回的是 char 类型,而当它被赋值给 int 时,Java 会自动执行宽化类型转换(widening conversion),即把字符的 Unicode 码点(ASCII 值)转为整数 —— 例如 '0' 的 Unicode 值是 48,'1' 是 49,依此类推。因此,当 str = "30" 且 i = 0 时,str.charAt(0) 返回 '3',其 ASCII 值为 51,这正是你观察到输出为 51 的根本原因。
要正确获取字符所代表的数字值(即 '3' → 3),推荐以下两种安全、高效的方式:
✅ 推荐方式一:使用 Character.digit(char, radix)
该方法专为字符转数字设计,支持任意进制(十进制传 10),对非数字字符返回 -1,无异常风险,性能最优:
int base = Character.digit(str.charAt(i), 10); // 返回 3(当 char 是 '3')
if (base == -1) {
throw new IllegalArgumentException("Invalid digit character: " + str.charAt(i));
}
result += Math.pow(base, len); // 注意:原代码中写成了 "=+",应为 "+="
✅ 方式二:使用 Character.getNumericValue(char)
兼容性更广(支持罗马数字、上标数字等),但对纯阿拉伯数字同样有效:
int base = Character.getNumericValue(str.charAt(i)); // '3' → 3
⚠️ 注意事项:
- 原代码中 result=+Math.pow(...) 是语法错误,应为 result += Math.pow(...)(累加),否则每次循环都会覆盖 result 值;
- Math.pow() 返回 double,用于整数幂运算可能存在精度误差(尤其对大数),建议改用 long 手动累乘或 BigInteger 提升鲁棒性;
- str.charAt(0) 在内层循环中写死为索引 0(见原代码 charAt(0)),实际应为 charAt(i),否则所有位都取首字符,逻辑错误。
完整修正示例(含阿姆斯特朗数校验逻辑):
private static boolean isArmstrong(int number) {
String str = Integer.toString(number);
int len = str.length();
long sum = 0;
for (int i = 0; i <p>总结:charAt() 从不直接返回“数字值”,它返回的是字符。务必通过 Character.digit() 等语义明确的方法完成字符到数字的转换,同时注意运算符、索引变量和数据类型精度等细节,才能写出健壮可靠的数值处理逻辑。</p>










