改写计算器程序时,用printf输出double结果出现大量末尾零的问题求助
问题分析与解决方案
1. 小数点后大量零的原因
printf的%f格式符默认会输出6位小数,哪怕计算结果是整数,也会自动补零到6位。如果想让输出根据实际数值自动调整(整数不显示小数部分,非整数只保留必要的有效位数),直接用%g格式符替换%f即可,它会自动去掉末尾的无效零。
2. 输入运算符的隐藏问题
你用scanf("%c", &rechop)读取运算符时,前面输入数字后按下的回车(换行符\n)会被当成字符读取,导致rechop拿到的是换行而不是你输入的+/-/*/。解决方法是在%c前加一个空格,让scanf自动跳过空白字符:scanf(" %c", &rechop)。
3. 除法结果不符合预期的问题
zahl1和zahl2都是int类型,执行zahl1 / zahl2时会触发整数除法(只保留商的整数部分),哪怕之后赋值给double变量,结果也已经是整数了(比如5/2会得到2而不是2.5)。需要把其中一个操作数强制转换为double再计算:erg = (double)zahl1 / zahl2;。
修正后的完整代码
#include <stdio.h> int main(){ printf("Taschenrechner\n"); int zahl1, zahl2; char rechop; double erg; printf("Gib die Rechnung ein: "); scanf("%d", &zahl1); scanf(" %c", &rechop); // 加空格跳过空白字符 scanf("%d", &zahl2); if (rechop == '+'){ erg = zahl1 + zahl2; printf("Ergebnis: %g\n", erg); // 用%g自动适配输出格式 } else if (rechop == '-'){ erg = zahl1 - zahl2; printf("Ergebnis: %g\n", erg); } else if (rechop == '*'){ erg = zahl1 * zahl2; printf("Ergebnis: %g\n", erg); } else if (rechop == '/'){ erg = (double)zahl1 / zahl2; // 强制转换为double避免整数除法 printf("Ergebnis: %g\n", erg); } else { printf("Keine gültige Rechenoperation!\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Luki
相关产品推荐
相关产品推荐

