当前位置:首页 » 编程语言 » c语言中小数点后第六位就出错
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中小数点后第六位就出错

发布时间: 2022-08-17 12:51:16

c语言 运行结果中为什么双精度实型只输出小数点后六位

在C语言中,输出double类型(双精度实型)以及float类型(单精度实型)时,默认输出6位小数。

比如这样的代码:

doublea=1;
printf("%lf ",a);

输出会是

1.000000

但是有时六位会显得很长,没必要。比如计算平均分,一到两位小数就足够了。

可是有时六位又不够,需要更多位小数,比如计算高精度平方根。

这时可以用printf的格式控制。

如果要输出n位小数,那么可以用%.nlf的格式。其中n为数字。

如要输出10位小数,那么

printf("%.10lf ", a);

即可


类似的输出1位小数

printf("%.1lf ", a);

② 为什么这个c语言程序输入小数点会出错

这个程序中定义的 变量i和数组 a[5]都是int型的,而且scanf("%d", &a[i]);中要求输入的数为%d也是整形,所以只能输入整型数值,你可以将变量定义类型改为
double i, a[5]; 并且scanf("%d", &a[i]);改为scanf("%lf", &a[i]);就可以输入带有小数点的数值了

③ C语言小数点后位数问题。。。

这是double类型导致的。
如果是C#,定义为decimal类型,就可以解决。
但是,对于C语言,应该是没有办法处理(对于我而言-_-0),

只有把精度下降到12位了。

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

想要搞清楚这个问题,你需要了解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

⑤ C语言中,float类型怎么储存小数点后六位的,第六位会四舍五入么

你上面的2个结果写颠倒了吧? -- 这里面涉及到两个精度问题,即printf的指定精度,以及c的数据类似float和double的精度。

printf("%f
",x);

%f, 没有指定精度(位数),c缺省设定的是小说点后6位,因此截短(四舍五入了)

printf("%.12lf
",x);

这个指定了精度是小数点后面12位,因此输出12位;但之所和原来赋值时不同,是由于x的类型是float,而非double。 float的精度本身不如double。 这个话题由来已久,涉及到电脑中对小数的存储模式,简单而言,十进制的小数部分是按照1/2+1/4+1/8+....这样的方式去逼近的。因此存在误差,也就是所谓的{存储精度}的问题。


float,32位对浮点数的表达是:0~22位=尾数;23~30是指数,31位则是符合位。

float x = 1.23456789 = 0x3F9E0652

double x = 1.23456789 = 0x3FF3C0CA4283DE1B


而y由于本身就是double (64位存储,尾数部分有52位表示,11位指数位和1个符号位构成),电脑的存储精度要高。

y=9.876543210000 = 0x4023C0CA4588F633

y=9.876543 = 0x412ABFFE00000000


因此如有可能,尽量用double。

⑥ C语言 计算该组数的平均值并输出,个数保留小数点后6位。

#include<stdio.h>
int main()
{
int n,i;
float a[20],q,sum=0;
scanf("%d",&n);
for (i=0;i<n;i++){
scanf("%f",&a[i]);
}
for(i=0;i<n;i++){
sum=sum+a[i];
q=sum/n;}
printf("%0.6f",q);
return 0;
}
注意,i和n为整数类型,如果赋值为其他类型不进行数据类型转换会出错!

⑦ c语言如何控制输入的数只能保留小数点后六位。例如,我硬是输0.1234568 但是程序还是按0.123456算

scanf("%8f",&a)
scanf()函数的一般格式为:scanf("格式字符串",输入项首地址表)
scanf的格式控制的一般形式为:% • [宽度][F|N][h|l]类型字符 * []中的控制字符为可选项 * "*"表示该输入项读入后不赋予任何变量,即跳过该输入值。这在减小内存开支上面还是有一点用处的,不需要的字符直接跳过,免得申请没用的变量空间 * "宽度"表示输入读入字符的长度,对于整型表示截取相应宽度的数字赋给后面列表中的相应变量;对于字符型表示读入相应长度的字符后把第一个字符赋给相应的变量,其余的自动舍弃。例如scanf("%2d%3d",&a, &b);如果输入为12345则将12赋给a,将45赋给b;scanf("%2c%3c",&a, &b);如果输入为12345则将'1'赋给a,将'3'赋给b * F 、N、h、l分别表示远指针、近指针、短整和长整型,对于_int64相应的控制字符为ll或I64 * "类型字符"为 d -- 输入十进制整数 、o -- 输入八进制整数 、x -- 输入十六进制整数 、u -- 输入无符号十进制整数 f或e -- 输入实型数(用小数形式或指数形式) 、c -- 输入单个字符 、s -- 输入字符串

⑧ C语言中%f表示的是什么,为什么有时小数点后保留6位,有时小数点后保留1位

printf("%f",fVal);//这是浮点默认输出格式,小数点保留6位

printf("%.1f",fVal);//.1是说明,小数点保留1位,对其后的数据进行四舍五入

printf("%.2f",fVal);//.2是说明,小数点保留2位,对其后的数据进行四舍五入,你想保留几位,就用点几

printf("%10f",fVal);//输出宽度为10个字符,右对齐,前补空格,小数点保留6位

printf("%10.2f",fVal);//输出宽度为10个字符,右对齐,前补空格,小数点保留2位

在格式化输出中,%f和%e默认都是都是六位,不过%e输出的话幂级数也占三位。

%10.3f

整个输出占10格(含.±号)小数占3格

默认

%f效果等于0.123456

%e效果等于0.12345e+01

float类型的精度,只能保证前6位是绝对精确的,而第7位可能是准确的,也可能是近似的。在设计时,打印浮点数是默认的六位数字。超过6位输出不精确的值,意义不大。如果第七个数字不准确,第八个数字就完全没有意义。小于6,有效数字更小。



(8)c语言中小数点后第六位就出错扩展阅读:

如果存储比精度更重要,可以考虑对浮点变量使用浮点类型。相反,如果精度是最重要的条件,则使用double。

浮点变量可以提升为更大的基数类型(从float到double)。当您对浮点变量执行运算时,通常会发生提升。该算法的执行精度始终与精度最高的变量相同。例如,考虑以下类型声明:

floatf_short;doublef_long;longdoublef_longer;f_short=f_short*f_long;

在前面的例子中,变量f_short被提升为double类型并乘以f_long;然后,结果循环为float类型,然后循环为f_short。

⑨ C语言编译圆周率(为什么小数点后第六位就出错求改正)

浮点数把?它的有效位,就是hi小数点后面6位,
可以用double类型,或者精度更高的,~~~好像有