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

C语言中使用double类型遇问题:输入后结果始终为0,求解答

问题

以下是我编写的C语言代码:

#include<stdio.h>

int main(void)
{
    //declare and initialize variables.//
    double dollars = 0;
    double exchange_rate = 0;
    double shekels = 0;
    
    //get input from user.//
    scanf("%f %f", &dollars, &exchange_rate);
    
    // calculate sum.//
    shekels = exchange_rate * dollars;
    
    // print result.//
    printf("%f", shekels);
    
    return 0;
}

无论输入哪两个数值,输出结果始终为0。此前使用double类型时也遇到过这类问题,想了解错误所在,以及double类型的适用场景和正确使用方法。


解答

错误原因

核心问题是scanf格式符与变量类型不匹配:你用%f读取double类型变量,但%f是专门用于float类型的格式符。double是64位浮点数,float是32位,用错格式符会导致输入值无法正确写入double变量,变量会保持初始的0值,最终计算结果必然为0。

double类型适用场景

  • 高精度计算场景:金融结算、科学计算(物理/工程公式)、统计分析等,double提供约15-17位有效数字,精度远高于float的6-7位
  • 大范围数值处理:double的取值范围比float更广,能处理更大或更小的数值
  • 通用浮点数场景:C语言中多数数学库函数(如sin、sqrt)的参数和返回值默认是double,日常浮点数计算优先用double更稳妥

正确使用方法

  1. 输入输出格式符匹配
    • 读取double:必须使用%lf格式符(仅针对scanf系列函数)
    • 输出double:printf系列函数兼容%f和%lf,但推荐统一用%lf保持格式一致性
  2. 变量初始化
    • 声明double变量时建议用浮点数形式初始化,比如double num = 0.0;,明确表示是浮点数类型
  3. 运算注意事项
    • 避免整数除法陷阱:若需要浮点数结果,运算数至少有一个是浮点数,比如5.0/2而非5/2(后者是整数除法,结果为2)
    • 浮点数比较:不要直接用==判断两个double是否相等,因为二进制浮点数存在精度误差,应判断两者差值的绝对值是否小于极小值(如1e-9)

修正后的代码

#include<stdio.h>

int main(void)
{
    // 声明并初始化变量
    double dollars = 0.0;
    double exchange_rate = 0.0;
    double shekels = 0.0;
    
    // 使用%lf读取double类型变量
    scanf("%lf %lf", &dollars, &exchange_rate);
    
    // 计算兑换金额
    shekels = exchange_rate * dollars;
    
    // 使用%lf输出double类型变量
    printf("%lf", shekels);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者joan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:50:44