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

Kotlin实现大数字字符串加法结果不符问题求解

Kotlin 超大数字字符串加法实现(修正精度问题)

问题根源

你之前通过将字符串转为Double相加的方式,会因为Double的精度限制导致结果失真。Double只能精确表示2^53(约9×10¹⁵)以内的整数,而示例中的数字远超出这个范围,超出部分会被近似处理,最终输出末尾出现大量0的错误结果。

正确实现思路

要精确计算超大数字的加法,必须模拟人工加法的逻辑:从数字的末尾(低位)开始逐位相加,同时处理进位,最后拼接结果。

完整实现代码

fun addLargeNumbers(num1: String, num2: String): String {
    val resultBuilder = StringBuilder()
    var ptr1 = num1.length - 1
    var ptr2 = num2.length - 1
    var carry = 0

    // 循环处理所有位,直到两个数字都遍历完且无进位
    while (ptr1 >= 0 || ptr2 >= 0 || carry > 0) {
        // 取出当前位的数字,指针越界则取0
        val digit1 = if (ptr1 >= 0) num1[ptr1] - '0' else 0
        val digit2 = if (ptr2 >= 0) num2[ptr2] - '0' else 0
        
        // 计算当前位总和与进位
        val total = digit1 + digit2 + carry
        carry = total / 10
        // 将当前位结果加入构建器
        resultBuilder.append(total % 10)
        
        // 指针左移
        ptr1--
        ptr2--
    }

    // 反转得到正确顺序的结果字符串
    return resultBuilder.reverse().toString()
}

// 测试示例
fun main() {
    val num1 = "3334567891011121314151648"
    val num2 = "12345678911"
    println(addLargeNumbers(num1, num2)) // 输出:3334567891011133659830559
}

代码说明

  • 使用StringBuilder高效构建结果,避免频繁字符串拼接带来的性能损耗
  • 双指针分别遍历两个数字的末尾,处理不同长度数字的边界情况(短数字高位补0)
  • 全程用整数类型计算每一位的和与进位,确保精度无损失
  • 最后反转构建器内容,得到从高位到低位的正确结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:20:45