鱼C论坛

 找回密码
 立即注册
查看: 2804|回复: 9

同学们!为什么我int变量赋值给float,打印出来是这样?

[复制链接]
发表于 2022-10-16 20:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入 1
结果是 x=0.00,y=1.00

我知道输入类型
scanf("%d",&x);
应该改成scanf("%f",&x);
就不会有问题了

但我想知道现在这个结果是 x=0.00,y=1.00怎么来的?
y=x*x+1 运行难道不是 1*1+1等于整型的2吗?
然后赋值给浮点型变量y,y等于2.0,再输出保留两位小数,y等于2.00,为什么不是这样?

代码如下
#include <stdio.h>
int main(){
        float x,y;
        scanf("%d",&x);
        if(-5<x && x<0){
                printf("x=%.2f,y=%.2f",x,y=-x+4);
        }
        //===================================================
        else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",x,y=x*x+1);//这行!这行!
        }
        //===================================================
        else if(x == 0){
                printf("x=%.2f,y=0.00",x);
        }
        else{
                printf("No meaning");
        }
        return 0;
}
1016.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-16 20:53:03 | 显示全部楼层
本帖最后由 tommyyu 于 2022-10-16 20:56 编辑

不能用%d输入,否则x就是0,y = 0*0+1 = 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-16 21:08:02 | 显示全部楼层
        scanf("%f" , & x) ; // scanf() 的格式描述符与变量之间必须对号入座,浮点型变量应该用 "%f" 而不是 "%d" 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-16 22:27:33 | 显示全部楼层
"不要用%d,不要用%d,不要用%d",重要的事情说三遍
解释一下:你用%d输入x,错误,但是C语言不会报异常,所以x会得到一个值,因为float类型本身就会丢失精度,所以这个值近似与0,所以执行else if(0<x && x<5)这个条件,然后x=0.0,y=1.00
(个人理解)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 15:04:29 | 显示全部楼层
#include <stdio.h>
int main(){
        float x,y;
        scanf("%d",&x);
        if(-5<*(int*)&x && *(int*)&x<0){
                printf("x=%.2f,y=%.2f",(float)(*(int*)&x),y=-(float)(*(int*)&x)+4);
        }
        //===================================================
        else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",(float)(*(int*)&x),y=(float)(*(int*)&x)*(float)(*(int*)&x)+1);//这行!这行!
        }
        //===================================================
        else if(x == 0){
                printf("x=%.2f,y=0.00",(float)(*(int*)&x));
        }
        else{
                printf("No meaning");
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-17 16:00:40 | 显示全部楼层

兄弟辛苦了,帮我加了那么多强制转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-17 16:03:04 | 显示全部楼层
FengYue20 发表于 2022-10-16 22:27
"不要用%d,不要用%d,不要用%d",重要的事情说三遍
解释一下:你用%d输入x,错误,但是C语言不会报异常, ...

这个丢失精度能详细讲讲吗?为什么这个值会近似于0?丢那么多的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 17:03:14 From FishC Mobile | 显示全部楼层
转换符要和你声明的变量类型一致
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 17:47:39 | 显示全部楼层
未被驯化的甲鱼 发表于 2022-10-17 16:00
兄弟辛苦了,帮我加了那么多强制转换

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-17 22:26:50 | 显示全部楼层
#include <stdio.h>
int main(){
        float x,y;    //这为float类型的对应是%f ,用%d当然会有问题了
        scanf("%d",&x);  //用%d来输出准确来说是有值的但是由于格式符不对输入的是乱码,应该会被判断有值
                                 //所以会执行第二if语句
        if(-5<x && x<0){
                printf("x=%.2f,y=%.2f",x,y=-x+4);
        }
        //===================================================
        else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",x,y=x*x+1);//这行!这行!
        }
        //===================================================
        else if(x == 0){
                printf("x=%.2f,y=0.00",x);
        }
        else{
                printf("No meaning");
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 14:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表