C语言中%lf格式化输出异常问题求助
问题分析:为什么%lf输出浮点数时小数部分丢失?
嘿,我一眼就看到你代码里的问题了——你在处理小数部分的时候踩了C语言整数除法的坑!这就是为什么输入123.648后,输出却是123.000000的原因。
核心问题:整数除法导致小数部分丢失
你代码里处理小数位的这行:
result = result + (ch - '0') / negativeMult;
这里ch - '0'是整数类型(int),negativeMult也是int类型。在C语言中,两个整数做除法会执行整数除法,直接截断小数部分。比如当你计算6/10时,结果不是0.6而是0;4/100的结果也是0——所以你的小数部分根本没被加到result里,最终结果自然只有整数部分。
修复方法:强制浮点除法
只需要把其中一个操作数转换成double类型,让编译器执行浮点除法即可。修改这一行:
result = result + (double)(ch - '0') / negativeMult;
或者,你也可以直接把negativeMult的类型定义为double:
double negativeMult = 10.0;
这样除法操作会自动变成浮点除法,小数部分就能正确累加了。
额外的小优化建议
你的代码还有几个可以完善的地方:
- 缺少负号处理:如果输入是
-123.45,当前代码会直接判定为非数字,你可以在开头判断如果第一个字符是'-',标记符号并跳过该字符,最后给result乘以-1。 - 变量命名更清晰:
negativeMult这个名字有点让人困惑,改成decimal_scale或者factor会更容易理解。 - 输入读取的鲁棒性:
scanf("%c")会读取换行符等空白字符,用getchar()替代会更直观。
修复后的完整代码
#include <stdio.h> int main() { char ch; int isNumber = 1, dot = 0, isNegative = 0; double result = 0; double decimal_scale = 10.0; // 改成double类型,更清晰的命名 printf("\nEnter characters: "); ch = getchar(); // 用getchar()读取更直观 // 处理负号 if (ch == '-') { isNegative = 1; ch = getchar(); } while (ch != '\n') { // 用'\n'替代10,可读性更好 if ((ch >= '0' && ch <= '9')) { if (dot) { // 浮点除法,正确累加小数部分 result = result + (double)(ch - '0') / decimal_scale; decimal_scale *= 10; } else { result = result * 10 + (ch - '0'); } } else if (ch == '.') { if (dot) { isNumber = 0; break; // 多个小数点直接判定为非数字 } else { dot = 1; } } else { isNumber = 0; break; } ch = getchar(); } if (isNegative && isNumber) { result *= -1; } if (isNumber) { printf("\nThe number is %lf", result); } else { printf("\nEntered characters are not able to be a number."); } return 0; }
现在测试输入123.648,输出就会是The number is 123.648000,完全符合预期。
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

