You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:01:24