小数点对齐是核心,需先统一小数位数再分整数和小数部分模拟加法,小数进位必须传递至整数部分,全程用字符串操作避免浮点精度丢失。
直接把两个带小数的大数当字符串相加会出错,比如 "12.34" 和 "5.678" 如果不处理小数位数,就无法对齐个位、十分位、百分位。关键不是“大数加法”或“小数加法”单独成立,而是先统一小数位数,再拆成整数部分和小数部分分别运算。
find('.') 找小数点位置,分别计算小数位数:dec_len_a = str_a.length() - pos_a - 1
max_dec,然后把两个数都补零到该长度(如 "12.34" → "12.340")max_dec 位小数部分相加后可能产生进位(比如 "0.999" + "0.002" = "1.001"),这个进位必须传给整数部分。不能把整数+小数拼起来再算,也不能忽略小数进位。
carry)分别处理整数串和小数串carry == 1,需向整数部分加 1(即调用一次整数加法)"999" + "1" = "1000"),要保留完整结果,不能截断'0' 可以去除,但要去完再判断是否整个小数部分为空(即结果为整数)真实输入常含前导零、负号、多余空格、甚至没有小数点(如 "123" 或 "-45.6"),不清洗就进核心逻辑会越界或逻辑错。
find_first_not_of(' ') 和 find_last_not_of(' ') 去首尾空格".0"(如 "123" → "123.0"),再走对齐流程count('.') != 1 检查并报错double 或 long double 转换,精度必然丢哪怕 std::stod("12345678901234567890.123456789") 看似能转,实际有效位数只有约 15–17 位,远低于大数需求。所有数字必须全程以 string 或 vector<int></int> 存储,逐字符/逐位操作。
立即学习“C++免费学习笔记(深入)”;
stringstream << setprecision(...) 输出浮点——它底层仍是二进制浮点,无法精确表示十进制小数string(便于补零和截取),整数部分也可用 string,避免 vector 内存管理开销string add_string(const string& a, const string& b),专用于非负整数字符串相加,复用性高"0.0" + "0.0"、"999.999" + "0.001"、"123" + "45.6"、"0.1" + "0.2"(验证是否输出 "0.3" 而非 "0.30000000000000004")小数点对齐和进位传递这两个环节,稍有疏忽就会导致结果偏移一位或丢掉末尾零,调试时建议先打印对齐后的整数/小数两段字符串,再看加法中间结果。