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

如何让Java数字转文字程序支持大于21.4亿的超大数值输入

问题背景

我正在开发一款将数字转换为对应英文单词格式的Java程序,最初实现的代码仅支持输入不超过int类型最大值(约21.4亿)的数字,计划升级支持更大数值。
补充说明:我已经将代码中所有int类型替换为long数据类型,成功将数值上限从21.4亿提升到了9990亿,但long类型的理论最大值是9京(9 quintillion),请问是什么原因导致无法达到理论上限?

现有代码

public class Converter {

    public static WordList wordFormat = new WordList();

    public static final void converter(long value) {

        long valueSize = String.valueOf(value).length();

        String[] output = new String[(int) valueSize];

        long outputSize = output.length;
        long tracker = 1;
        long commasCTR = 0;
        long preValHolder = 0;

        // Returns "Zero" if value = 0
        if (value == 0) {
            System.out.println("Zero");
            return;
        };

        // Self-made Conversion Method
        for (long valHolder = value, placeVal = 0; placeVal <= outputSize - 1; placeVal++, tracker++) {

            long remainder = valHolder % 10;
            long nextDigit = valHolder / 10 % 10;
            valHolder = valHolder / 10;
            // Num to Word Conditional Statements
            switch ((int) tracker) {
                case 1: 
                    if (placeVal == 0) {
                        output[(int) placeVal] = WordList.wordFormat[0][(int) remainder]; // Ones
                    } else {
                        output[(int) placeVal] = WordList.wordFormat[0][(int) remainder].concat(" " + WordList.commas[(int) commasCTR]); // Commas
                        commasCTR++;
                    }
                    break;
                case 2: 
                    if (remainder == 1) { // Teens
                        output[(int) placeVal] = WordList.wordFormat[1][(int) preValHolder + 1];
                        if (placeVal < 3) output[(int) placeVal - 1] = " ";
                        else output[(int) placeVal - 1] = WordList.commas[(int) commasCTR - 1];
                    } else if (placeVal > 3 && preValHolder == 0 && remainder == 0 && nextDigit == 0) { // Comma Zero Value Handler
                        output[(int) placeVal - 1] = " ";
                        output[(int) placeVal] = WordList.wordFormat[2][(int) remainder];
                    } else {
                        output[(int) placeVal] = WordList.wordFormat[2][(int) remainder]; // Decades
                    }
                    break;
                case 3: 
                    output[(int) placeVal] = WordList.wordFormat[3][(int) remainder]; // Hundredths
                    break;
            }
            // Re-assigning Values
            if (tracker == 3) tracker = 0;
            preValHolder = remainder;
        }
        for (long i = outputSize - 1; i >= 0; i--) {
            if (output[(int) i] == " ") continue;
            System.out.print(output[(int) i].trim() + " ");
        }
        return;
    }
}
原因分析
  • 核心问题是WordList.commas单位数组长度不足。long类型最大值为9223372036854775807,共19位,每三位对应一个量级单位,依次需要千、百万、十亿、万亿、千万亿、百京共6个单位,你当前的commas数组仅定义到千亿对应的单位,当数值超过999999999999(12位,即1万亿)时,commasCTR自增后会超出数组索引范围,触发数组越界异常,导致无法处理更大的数值。
  • 代码中存在多处long转int的强转操作,虽然long最大值的位数仅19位,现阶段不会触发int溢出,但如果后续要支持超过int数组长度上限的超大数值(比如BigInteger类型),这部分逻辑也需要调整。
修复方案
  1. 补充WordList.commas数组的单位,按顺序添加trillion(万亿)、quadrillion(千万亿)、quintillion(百京),保证数组长度至少为6,覆盖long最大值对应的所有量级。
  2. 增加边界校验逻辑,在访问WordList.commas前先判断commasCTR是否小于数组长度,避免异常。
  3. 如果后续需要支持比long更大的数值,可以将入参改为BigInteger类型,同步调整数值处理逻辑即可。

内容的提问来源于stack exchange,提问作者Francis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:24:03