C语言学习---关于double类型的输入问题

关于这个问题主要是在cprime书练习的时候我出现的的一个小bug

对于c语言的菜鸟来说 小小记录一下

这个题是这样的:

编写一个程序, 提示用户输入一个double类型的数, 并打印该数的立方值。 自己设计一个函数计算并打印立方值。 main()函数要把用户输入的值传递给该函数

看上去是不是很简单

然后我就开始写了

#include<stdio.h>
void cube(double n);
int main(void){
    double i;
    printf("请输入一个数字:");
    scanf("%f",&i);
    cube(i);
    return 0;
}
void cube(double n){
    printf("这个数字是 %f\n",n);
    printf("数字 %f的立方是:%f\n",n,n*n*n);
}

🌳 看看出了bug?

最后输出的结果:

在这里插入图片描述

❓为啥会这样

然后我就去查了

💮 接下来来自一个大佬的回答:

为什么double类型输入(scanf)用%lf,输出(printf)用%f? - 左天佑的回答 - 知乎 https://www.zhihu.com/question/55529981/answer/145158602

float是浮点型,double是double float的意思,也就是双精度浮点型。%f是以float类型格式化输入或输出,%lf是long float的意思(估计是和%ld对应),也就是指double类型。

scanf读%f时,系统会按照4字节长度来读,读完要放到一个4字节的空间位置,也就是一个float所在的位置。那么double有8字节空间,比4字节还大,能不能来放?答案是不能。因为 float和double的关系不像int和long的关系那样,简单的在后面增加4字节的位置。float和double有自己专门的数据排列格式, 如下:

​ 如果读的时候明明是按照float的格式来读,但是却存在double的空间内,并且之后一直按double来操作,那么里面数据的符号位、阶码、尾数就全错位了。除非你在用的时候把每个double强制转换成float来用,但是何必多次一举?

​ 同理,如果读用%lf来读,却存在float中,不仅格式错位,而且存储空间也不够,会有数据丢失。

所以用scanf读的时候,读%f就规规矩矩的放进float中来存,读%lf就放进double中,这样在使用的时候里面的数据才不会错位。

​ 在printf的时候,首先C里面的float其实在使用过程中都是被隐式转换成了double来用。所以你在printf时用float还是double其实是一样的。用%f和%lf都可以。

🍺 原来如此!

于是回去刷刷修改了代码

void Cube(double num);

int main() {
    double num;

    printf("请输入一个 double 类型的数:");
    scanf("%lf", &num);

    // 调用函数计算并打印立方值
    Cube(num);

    return 0;
}

// 函数定义
void Cube(double num) {
    double cube = num * num * num;
    
    printf("该数的立方值为:%.2lf\n", cube);
}
cube = num * num * num;
    
    printf("该数的立方值为:%.2lf\n", cube);
}

结果!😆
在这里插入图片描述
原来问题是出在这里!
🌱之后要好好注意输入输出的类型匹配的问题了!同时记得你要为你创建的每一个变量的值负责!也就是要赋初值,不要一上来就做计算~

🌈ok,完结~ (●ˇ∀ˇ●)点个赞 点个赞~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~光~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值