c语言中float输出的结果从左往右有效数字是6位,但是我编写这个小程序后怎么就只有3位有效?望高手解答。

#include<stdio.h>
void main()
{
float a=78.88;
printf("%f\n",a);
}

输出结果却是78.879997

表示很无语,为什么。

想要搞清楚这个问题,你需要了解float类型在内存中的存储结构
符号位|指数|尾数
78.88在内存中的结构为
01000010 10011101 11000010 10001111
第一位为符号位,0
后面八位为指数位10000101
最后23位为尾数0011101 11000010 10001111
0,10000101,1.0011101 11000010 10001111
指数需要减去127才是真正的指数
10000101 - 01111111 = 00000110,是10进制的6
1.0011101 11000010 10001111*(2^6)
=1001110.111000010 10001111
整数部分1001110转换10进制为78
小数部分0.111000010 10001111转换10进制为0.87999725341796875
所以你在输出是按小数点后六位输出为78.879997追问

我试过78.77错误,78.777正确,78.99错误 仿佛只要小数点后前两位一样就出错,但是78.8899正确 输入78.80 78.82 也正确,但是输入78.81就错误 输入78.8840也正确

还有,您的解释看明白了,问下,在内存中的二进制显示如何才能用调试模式看出来?还有,书上写的是float精度是六位,这样岂不是不是六位了
希望高手帮忙解决下上述两条问题。多谢

追答

你可以自己写段代码,把float保存的内存片段按bit打印出来。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-16
有效数字6位, 指 78.8799 ,有效数字精度到 6位,它含截断误差,截断误差 在第7位。

它不等于 78.88; 是因为 10进制化2进制,再2进制化10进制。引入了截断误差。追问

请问什么是截断误差,精度既然是六位,为什么只有3位准确?以及,怎样让输出的结果变为准确值?

追答

十进制化二进制化不尽,(类似无限循环小数),float 数只有 二进制 32 位存放空间,存不下的部分就丢失了。这叫“截断”(尾巴没了)。精度六位,指 数的期望值与数的近似值的误差 在最右边,依次数去是第7位截断。而不是要写出6个一模一样的数来。
这里 误差 fabs( 78.88 - 78.8799) = 0.0001 ,当然,你可以用%.10f 显示更多位。

变为“准确值”:用 math,h 里的函数,例如 地板,天花板 (看你需要)或自编4舍5入程序。。
再要准确,你用 字符串存放。

第2个回答  2012-03-16
单精度浮点型有效数字是7位 后面一般补齐6位小数
楼主用的是VC6.0 吧 用TC2.0 试试 或许和软件对读数据的处理有关 具体原因我也不明白 帮不了你
第3个回答  2012-03-21
zy im DB haha

c语言中float输出的结果从左往右有效数字是6位,但是我编写这个小程序后...
所以你在输出是按小数点后六位输出为78.879997

float浮点数有效数字只有6位,为什么不是7位?
float f = 123456.789 printf("%.2f",f);因为要求输出结果保留两位,所以输出结果小数点后会有两位,但是!这两位小数保留的毫无意义,因为它不可靠,可靠的6位有效数字已经被整数部分的123456占完了。根据以上,楼主可以自行给 f 赋各种不同值,多次调整整数部分与小数部分的位数和大小,查看输出,相...

C语言中关于float类型变量输出是的问题
记不太清楚啦。好像意思是说浮点可以精确7个有效数字。而且小位数默认为6位小数。你整数部分肯定不会出错的。但是只有7个有效数字。所以后面的其他小数点会出错。各个电脑出错的值会有点不太相同。

C语言中浮点数float和double输出的问题
精度是说某种类型的浮点数在C中计算时有多少位是有效的,这实际上是包括整数部分的,但不包括小数点那一位;而输出小数点后多少位是由输出函数printf中的控制字符串确定的。float的精度是6到7位,就是说连整数部分有6位是可信的,再长了就是机器垃圾值了;double有16到17位是可信的,再多了也是机...

c语言中的float数据类型的有效数字为什么是6~7位
float数据 机器内是2进制数,1位符号位 8位指数位 23位“尾数”位 共32 位 2进制数。平时讲 有效数字 是6~7位 ,指10进制。通常程序输入的数是10进制,进入机器后要化成2进制,计算完又转十进制输出。10进制到2进制,2进制到10进制 转换,有的数化不净,有的数化得净。如同10进制分数化10...

VC中float和double 型的数字位数是怎么规定弄呢?有效数字是6或7位?为 ...
x=123456789.0时,10位有效数字,同样也只能接收7位有效数字,那么89.0也是无效的,也是不准确地表示该数。如果你想电脑准确地表示该数应该用double类型就可以了。我再来给你讲一下为什么总是在小数点后有6位。原因是这样的:浮点型数据在内存中是按照指数形式存储的。系统把一个浮点型数据分成小数部分...

C语言的double与float类型最多只能默认输出小数位数都取6位?
float 为单精度,有效数字为6~7double 为双精度,有效数字为15~16 但他们在输出时,小数点后都有6位小数。例如3.123456 但是在格式化输出时例外。如:main(){ int a=15;float b=123.1234567;double c=12345678.1234567;char d='p';printf("a=%d,%5d,%o,%x\\n",a,a,a,a);printf("b=...

C语言 有关double型取值范围的问题
3.f格式符用来输出实数,以小数形式输出,因为你没有指定字段宽度,所以按系统自动指定,使整数部分全部如数输出,并输出6位小数。应当注意,并不是输出的都是有效数字,的精度的有效数字是7位有效数字,双精度是15位有效数字,只输出6位小数。这就是你输出小数总是6位的原因。你说的总是精确到小数后6位是不对的,...

C语言里 float 型的输出后是不小数点后必须的保留六位啊?谢谢啦~~
不是,默认是6位 printf("%.3f",d);.后面的3就是保留3位,你可以根据需要改动

C语言float a=1234.444输出为什么是a=1234.443970
你好,是这样子的。C中只保证6位有效数字,也就是只有1234.44保证是正确的,后面还有四位小数,是因为系统中默认float输出6位小数。后面的小数是3970这就涉及到内存和运算的问题,计算机只是以一个很接近的数字表示这个数的,而不是完全相等。

相似回答