C语言中 double数字 以浮点输出小数后面全部变为零的问题

#include"stdio.h"
main()
{
double b;
b=1234567890123456.123456;
printf("b=%f\n",b);
}

计算机内部保留的数值,精度是有限的。不同的C语言版本可能有不同。
常见的某些版本中,情况如下(其中的“位”指二进制的位):
float型:8位阶码,24位尾数;
double型:8位阶码,56位尾数。

阶码是用来表示小数点位置的,尾数则是表示有效数字的值。故double型有效数字最多保留56位。
故这种情况下,最低位的分辨能力,只能达到整个量程的2的56次方分之一。
如果数据本身,有更低位的小数,就只能舍入近似了。

而且我们知道,尾数还有正负两种可能,故其绝对值的最大值,只能达到整个量程的一半。
更何况,绝对值不见得能达到最大(规格化后可以不小于最大值的一半)。
如此,最低位舍入形成的相对误差,就会达到2的55次方分之一,至2的54次方分之一。

而如果用十进制表示,2的55次等于36028797018963968,2的54次方等于18014398509481984。都是17位的数字。

换句话说,double型精度,如果对于17位的十进制有效数字,其误差就相当于最低位了。
因此,如果您输入的数据有效数字更长,那么17位之后,肯定没有保留,已经不准确了。

而你的b=1234567890123456.123456;已经达到了22位,所以后几位肯定是不准的。

当然,我上面说的精度,只是某些版本中的。也不排除有更高精度的版本?
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-29
double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字。
而b=1234567890123456.123456;却是包含有22位有效数字,所以,它是超出了数据的有效存储范围。
还有,double在输出时,应该要用%lf格式符。本回答被网友采纳
第2个回答  2011-10-15
double只有15位的.你16位了
b=12345678901234.123456;
就可以了追问

大哥老实说我没懂你的意思。你的意思说double只有15位有效数字?那为什么后面还要输出来
我删除了两位 为什么后面小数是123000

追答

就是太长了,你小数点前没减少一位后面会多出来一个的.

本回答被提问者采纳
第3个回答  2017-10-29
您好,是因为double 型数据的有效位数(从左第一个不为0的数开始数)为15位左右,所以其它的就不一定准确
第4个回答  2011-10-17
数字太多了