Java十进制转任意进制程序返回负值问题求助
问题分析与修复方案
核心错误点
- 字符获取逻辑完全错误:
s1.indexOf(i)是查找字符i在字符串中的位置,这和你要获取字符串第i位字符对应数值的需求完全不符。这个操作会频繁返回-1(找不到对应字符),直接导致累加结果为负数。 - 位数权重计算颠倒:比如输入字符串
"123"(源进制为sBase),正确计算应该是1*sBase^2 + 2*sBase^1 + 3*sBase^0,但你的循环从i=0开始,把字符串第0位当成了最低位(权重sBase^0),数值计算完全错误,进一步引发溢出。 - 浮点运算精度问题:
Math.pow返回double类型,强制转换为int时会丢失精度,数值较大时会直接导致计算偏差或溢出。 - 未处理整数溢出:转换后的十进制数如果超出
int的范围(-2^31 ~ 2^31-1),会直接溢出变成负数。
修复后的完整代码
import java.util.Scanner; public class NumberSystemConversion { public static void main(String[] args) { System.out.println("输入源进制"); Scanner sc = new Scanner(System.in); int sBase = sc.nextInt(); System.out.println("输入目标进制"); int dBase = sc.nextInt(); System.out.println("输入要转换的数"); String numStr = sc.next(); // 先将源进制数转为十进制(用long降低溢出概率) long decNumber = 0; for (int i = 0; i < numStr.length(); i++) { char c = numStr.charAt(i); // 将字符转为对应进制的数值,同时校验输入合法性 int digit = Character.digit(c, sBase); if (digit == -1) { System.out.println("输入的数不符合源进制规则"); return; } // 用整数运算累加,避免浮点精度问题 decNumber = decNumber * sBase + digit; } System.out.println("转换后的十进制数:" + decNumber); // 再将十进制数转为目标进制 if (decNumber == 0) { System.out.println("转换后的目标进制数:0"); return; } StringBuilder result = new StringBuilder(); long temp = decNumber; while (temp > 0) { int remainder = (int) (temp % dBase); // 自动处理10进制以上的字母表示(如16进制的A-F) result.append(Character.forDigit(remainder, dBase)); temp = temp / dBase; } // 反转字符串得到正确顺序 System.out.println("转换后的目标进制数:" + result.reverse().toString()); } }
关键修复说明
- 用
Character.digit(c, sBase)替代错误的indexOf,既能正确将字符转成对应进制的数值,还能校验输入字符是否符合源进制规则。 - 采用
decNumber = decNumber * sBase + digit的整数运算逻辑,既避免了浮点精度问题,又正确实现了高位到低位的权重累加。 - 改用
long类型存储十进制数,大幅降低溢出概率(如果需要处理更大数值,可替换为BigInteger)。 - 补充了十进制转目标进制的完整逻辑,实现你最初想要的“任意进制互转”功能。
内容的提问来源于stack exchange,提问作者wyatrich
相关产品推荐
相关产品推荐

