为什么int可以用%d而float,float和double的区别却用%f呢

C语言中如果定义一个变量double k;那么下面是用printf或者scanf函数时使用%f还是%lf 那long double呢?_百度知道
C语言中如果定义一个变量double k;那么下面是用printf或者scanf函数时使用%f还是%lf 那long double呢?
C语言中float , double , long double三种类型的输入输出格式是有差别的,如果不正确使用,则会造成数据输入或输出的不正常,导致程序运行错误。各类型输入格式说明:float :float f1;输入:scanf(&%f&, &f1);输出:printf(&%f&, f1 );double:double d1;输入:scanf(&%lf&, &d1);输出:printf(&%lf&, d1 ); &或&printf(&%f&, d1 );&long double:long double ld1;输入:scanf(&%lf&, &ld1);输出:printf(&%lf&, ld1 );
其他类似问题
为您推荐:
提问者采纳
:用于双精度型数据的输出 这是在用scanf的时候要注意的: % [修饰符] 转换说明符 %f 为按浮点型小数输出 double 为双精度型数据
必须用%lf,这个时候可以用printf(&quot.而如果 j 是double型.并且j已经赋值过。你要处理的数据需要多大呢%f
为格式控制字符串的一般形式,&j);只是跟%lf这个格式输出的精度不一样罢了; scanf(&quot.
而long double其实呢,不然如果你,j): double j,用%lf 够了吧;%f&;
这个时候就会出现溢出;%f&quot
其他5条回答
所以 double k用%lf,long double占16个字节。如果用%f, long double k的话用%llff 占4个字节,lf占8个字节,double也占8个字节,%lf的话会溢出
两个都能用long double
一楼说法没错,long duoble只能用%lf
%f在大点的就%lf
scanf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求解关于C语言中float和double的问题_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:437,209贴子:
求解关于C语言中float和double的问题收藏
老谭的书都快学完了,这几天翻看第三章,恍然发现还有好多地方没搞明白。今天请教吧友们关于浮点型数据的问题!1.float和double的有效数字分别是6和15,为什么我定义float a=6.0在dev下怎么不会报错?(老谭书上不是说浮点数系统默认双精度)2.# include &stdio.h&int main(){
float a=3.1415926;
double b=3.1415926;
printf("%f,%lf",a,b);
}为什么float和double定义的数,输出的结果均为“3.141593”(怎么会都保留六位呢?)3.float和double所说的有效数字指的是小数点后还是什么,这里的有效数字能不能理解为“从第一个不是0的数字起,到精确到的位数止”?
福利不只是穿多穿少,还要有迷人的微笑!
另外,我在“
【入吧必看】C语言吧 吧规 & 入门指导 [2011.10]”下的C语言常见问题集 (C FAQ中文版,印刷版叫&495个C语言问题&)    中,发现这个资源无法下载,点击网站之后跳转不到!如果吧友们谁有FAQ中文版,还请给个地址,帮助学习!
有些编译器把float转换为double型了吧
求解啊!!!
在linux的gcc下,直接为float型赋值也是不会报错的。求高手解答阿!!!
把double型数据赋值给float型变量是不是自动进行类型转换?关于有效数字:比如(float型)此时系统用printf输出时小数点后默认6位,但由于其有效位数是6所以以后的 数都是随机的?我们平时所说的float型double型的精确位数指的是包括小数点前的,而printf语句默认输出六位小数?不知我这样理解是否正确?
我是一只小白~我什么都不懂~~请各位大神照应~~
星云大师:口袋没钱,心里没钱,轻松一辈子;口袋有钱,心里有钱,劳累一辈子;口袋没钱,心里有钱,痛苦一辈子;口袋有钱,心里没钱,快乐一辈子。
float 至少可以表示6位有效数字 double 至少10位有效数字 ,通常会更加多 ,我只是小白 刚刚好学了基本数据类型
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
*******************************float类型%d输出**************************************
& & & float
如果用printf("%d",a);输出的是0。&
但float型用%d输出是否一定是0呢,答案肯定不都是0;
& & & 为什么 7.5
用%d输出的是0?分析如下:
首先来了解下printf的输出格式,int 和 long int 都是32位的,用%d输出;float 、double都是%f输出,但
float 是32位的,double 是64位的,所以在参数传递的时候C语言统一将 float 类型数值传换为 double
类型再传入 printf 函数。如果是32位整型则输出格式为%lld。
& & & 下面来讲一下
&float a=7.5
printf("%d",a)输出为0的情况:
%d只输出低32位的数据,并将这些32位二进制以十进制数输出,编译器首先将
7.5从float类型转换为double类型,7.5在内存中的存放方式是0x40f00000,转换成double类型在内存中的数据就是这个0x401e,这个内存数据可以很明显看出低32位全是0,而%d则只能截取到低32位,所以这个以%d输出7.5的数值当然是
0了。如大家不相信可以用%lld
输出看看,这个%lld就很读到低64位数据,读出的结果就是0x401e,在屏幕上看到一个很大的十进制数。
如果我一定要输出7.5在内存中的存放方法怎么办呢?
可以用printf("%d",*(int
*)&a);这里做了一下处理,不是直接把a传进来,把a所在地址里的内容处理了一下,不管a是什么类型,只对地址进行操作,利用(int
*)&a,将a所在地址中的内容0x40f00000直接当成 int 类型传给printf,int
的类型数据不会再转成double类型了,所以输出正常,这个只是针对浮点型数据只占低32位,如果输出64位还得用%lld格式控制输出。
如果用printf("%d",(int)a),输出行不行,这个强制类型转换只针对a的数据类型进行转换,7.5转换 int
类型是7,而上面的*(int
*)&a,是对内存中的实际存储数据进行操作,蔽开数据类型这一层面,只将这个数据0x40f00000直接转成int类型输出。而(int)a,要先看a的类型,C语言会根据所要数据类型,对内存存储的数据进行改变,以便可以用int类型正确解析内存数据。
如果用printf("%d",(float)a),输出什么,输出的是0,这个只是将a的float类型还转成float类型,还是自动转成doube类型,传给printf函数。
为什么float非要转成double类型呢,因为printf格式控制浮点型输出只有%f,所以统一按doube类型输出,不像整型有32位的%d或%ld,64位的有%lld,这就将32位整型和64位整型用不同的格式控制分开了,而%f则没有,所以printf输出的浮点数其实是统一遍历了64位内存,如果float传入printf没有进行转换,那么printf输出高32位数据将不可预知,printf输出结果也就不正确了,因此传入printf的浮点数都会被编译器隐含转成double类型。
***********************int类型%f格式输出************************************
& & & 如果定义了int
a=0x40f00000;用printf("%f",a)输出的结果是多少呢?
答案是0,至少我们看的屏幕上显示的是0.000000,实际值可不是0啊,只是我们显示的精度只能有15位小数,而实际的数据可能很小很小,0.0000....000几百个0后会有几个有效数据,我们分析一下。
首先C语言把a传进printf,因为a是整型,所以不会自动转成double型数据,直接将0x40f00000传进printf,而%f寻的是64位内存,也就是把0xf00000这个内存中的数据当成浮点型输出来,那浮点型的数据是多少呢,又是怎么存储的呢?
64位浮点数的存放方式:
& & & 63位
& & 62~52位 &
& & & 1个符号位
&11个阶数 & &
从0xf00000来看
1)符号位是0,表示正
& & 2)阶数是0,表示-1023 + 1023 =
0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
3)尾数就是,0x00
4)浮点二进制表示
&2#1.0000*2^(-1023),-1023次方可想而知有多小。
这就是为什么我们的int型数据用%f输出是0.000000的原因。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。基于C++浮点数(float、double)类型数据比较与转换的详解
字体:[ ] 类型:转载 时间:
本篇文章是对C++中浮点数(float、double)类型数据比较与转换进行了详细的分析介绍,需要的朋友参考下
浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。1、将字符串转换为float、double过程存在精度损失,只是float、double各自损失的精度不相同而已std::string str="8.2";float cc=atof(str.c_str());& //cc的值为8.1999998std::string str="8.2";double cc=atof(str.c_str());& //cc的值为8.99932、将float、double转换为字符过程中可能存在精度损失,但是通过%.8lf可以规避(1)float小数点前后加起来有效数字只有6位。当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失//精度没有丢失char buf[100]={'\0'};float aa=8000.25;sprintf(buf,"%f",aa);&& ////精度没有丢失char buf[100]={'\0'};float aa=8.00025;sprintf(buf,"%f",aa);&& buf = 8.000250//精度丢失,存在误差char buf[100]={'\0'};float aa=;sprintf(buf,"%f",aa);& ////精度丢失,存在误差此时使用.8lf也无效char buf[100]={'\0'};float aa=;sprintf(buf,"%.8lf",aa); //6(2)double小数前后加起来的有效数字只有16位,当给定的double有效数在16位以内转换为字符串不会丢失精度,当有效位数大于16位湖影公寓存在精度丢失存在误差char buf[100]={'\0'};double aa=121.012;sprintf(buf,"%.20lf",aa); //121.//没有误差char buf[100]={'\0'};double aa=;sprintf(buf,"%.8lf",aa);std::cout &&buf&&std:: //03、浮点数比较用"=="来比较两个double应该相等的类型,返回真值完全是不确定的。计算机对浮点数的进行计算的原理是只保证必要精度内正确即可。我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float,和double 各有不同所以const float EPSINON = 0.00001;if ((x &= - EPSINON) && (x &= EPSINON) 这样判断是可取的至于为什么取0.00001,可以自己按实际情况定义根据上面分析建议在系统开发过程中设计到字符转换建议采用double类型,精度设置为%.8lf即可,在比较浮点数十建议EPSINON = 0.
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具&&/&&&&/&&&&/&&
小数也称实数或浮点数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。这是常见的小数的表现形式,称为十进制形式。
除了十进制形式,也可以采用指数形式,例如 7.25&102、0.0368&105、100.22&10-2 等。任何小数都可以用指数形式来表示。
C语言中的小数也有这两种表示形式。在书写时,十进制形式和数学中的一样,指数形式有所差异。
在C语言中小数的指数形式为:
a 为尾数部分,是一个十进制数,n 为指数部分,是一个十进制整数,E或e是固定的字符,其值为 a&10n。例如:
2.1E5 = 2.1&105,其中2.1是尾数,5是指数。
3.7E-2 = 3.7&10-2,其中3.7是尾数,-2 是指数。
0.5E7 =&0.5&107,其中0.5是尾数,7是指数。
C语言中小数的数据类型为 float 或 double:float 称为单精度浮点数,double 称为双精度浮点数。不像整数,小数的长度始终是固定的,float 占用4个字节,double 占用8个字节。
10 是固定的,不需要在内存中体现出来。正负号、指数(n)、尾数(a) 是变化的,需要占用内存空间来表示。
float、double 在内存中的形式如下所示:
输出 float 使用 %f 控制符,输出 double 使用 %lf 控制符,如下所示:
#include &stdio.h&
#include &stdlib.h&
int main()
float a=128.101;
float b=0.302f;
float c=1.f;
double d=123;
double e = 78.429;
printf(&a=%f \nb=%f \nc=%f \nd=%lf \ne=%lf\n&, a, b, c, d, e);
system(&pause&);
运行结果:
a=128.100998
b=0.302000
c=1.230024
d=123.000000
e=78.429000
对代码的说明:
1) %f 默认保留六位小数,不足六位以 0 补齐,超过六位按四舍五入截断。
2) 将整数赋值给 float 变量时会转换为小数。
3) 小数默认为 double 类型,加上后缀f才是float类型。
4) 由于内存有限,小数的精度受限,所以输出 a 时只能获得一个近似数。这点我们将在《》中重点讲解。

我要回帖

更多关于 double float 的文章

 

随机推荐