You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

改写计算器程序时,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:56