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
相关产品推荐
相关产品推荐

