C语言实现两分数求和时函数运行始终输出0.000的问题排查
代码异常根因与修复方案
核心错误点
- 求和函数
fracsum的返回值类型被错误声明为int,和内部计算的浮点结果类型完全不匹配。
当函数执行return res时,原本是double类型的计算结果会被强制截断为整数(例如0.375会被直接截断为整数0),并以4字节宽度的int类型值返回。
而printf在使用%.3f格式符输出时,是按照8字节宽度的双精度浮点数格式解析栈上的传入参数,内存读取错位后,拼接出的数值属于接近0的极小值,最终所有被解析的参数都会被输出为0.000,和实际运行现象完全吻合。 - 次要有精度隐患:内部变量使用
float类型存储运算中间值,容易在乘加计算过程中引入不必要的精度丢失。
修复方法
- 将
fracsum的返回值类型修改为double,保证返回值类型和printf的%.3f格式符要求的参数类型一致。 - 将形参与中间计算变量的类型统一调整为
double,降低浮点运算的精度误差。
修复后可正常运行的代码
# include <stdio.h> double fracsum(double n1, double d1, double n2, double d2) { double n3, d3; double res; n3 = (n1*d2) + (d1*n2); d3 = d1 * d2; res = n3 / d3; return res; } int main(void) { printf("%.3f %.3f %.3f\n", fracsum(1,2,2,4), fracsum(1,4,1,8), fracsum(4,3,5,6)); return 0; }
预期运行输出
1.000 0.375 2.167
内容的提问来源于stack exchange,提问作者DoJ
相关产品推荐
相关产品推荐

