⑴ c语言小数点后位数问题。。。
这是double类型导致的。
如果是C#,定义为decimal类型,就可以解决。
但是,对于C语言,应该是没有办法处理(对于我而言-_-0),
只有把精度下降到12位了。
⑵ 为什么用c语言写出来是这个样子啊哪里出错了为什么多了个3
请发你写的代码!
刚刚看到你发的代码。现在分析一下:
先说明一个原则:float数据不像整型数据那样,它不会进行准确的计算,它的计算要进行四舍五入的。
你的问题的原因是由于float型数据在内存中保存时,只保留6位有效的数字,比如:3.14159、31.4159、314.159以及3141.59都是具有六位有效的数字(小数点不计) 。这些数字都可以完整的保存在内存中。但是,在输出时,%f格式是默认输出带6位小数的数字(小数点后面有6位数字),这就会产生不够现象,如上面的:3.14159X、31.4159XX、314.159XXX和3141.59XXXX,后面的X号不会输出0,而是非常接近0或者9的数字,它们四舍五入都能得到原数。如:
3.14159会输出3.141590=3.14159——碰巧最后是0,去掉最后的0,直接得到原数
31.4159会输出31.415899≈31.4159——舍入最后二位数后得到原数
314.159会输出314.158997≈314.159——舍入最后的三位数字后得到原数
3141.59会输出3141.590088≈3141.59——舍入最后的四位数字后得到原数
而最后的X到底出现哪些数字,是由系统决定的。
现在来看你发来的问题,3.14159×25=78.53975,显然,最后要补充一位X的,而碰巧的是最后一位是3。仅此而已。
如果不让它出现,可以把y设置成double型数据,因为doule型有14位的有效数字,所以能够保证后面不出现3,而是0。
⑶ 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语言中,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语言编译圆周率(为什么小数点后第六位就出错求改正)
浮点数把?它的有效位,就是hi小数点后面6位,
可以用double类型,或者精度更高的,~~~好像有
⑹ 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语言中小数的误差怎么解决
一般是:根据问题领域所容许的的精度,定义一个误差上限(一个极小数)。然后在浮点计算时,计算结果与这个误差上限作比较,而不是与0作比较。
例如,牛顿迭代法求值:
double f(double x); // f(x)
double f1(double x); // f(x)的导函数
#define EPSILON 0.001 // 误差精度
double resolve(double x) { // x为初始近似解
while (1) {
double delta = f(x) / f1(x);
// 当迭代的变化量,小于误差精度时,就认为找到解了
if (delta > - EPSILON && delta < EPSILON) {
break;
}
x -= delta;
}
return x;
}
⑻ 为什么这个c语言程序输入小数点会出错
这个程序中定义的 变量i和数组 a[5]都是int型的,而且scanf("%d", &a[i]);中要求输入的数为%d也是整形,所以只能输入整型数值,你可以将变量定义类型改为
double i, a[5]; 并且scanf("%d", &a[i]);改为scanf("%lf", &a[i]);就可以输入带有小数点的数值了
⑼ 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,有效数字更小。
(9)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语言小数点后多少位的问题
C语言中浮点型一般分为float单精度型、double双精度型、long double长精度型,单精度浮点型小数点后面有效数字为6~7位和双精度浮点型小数点后面有效数字为15~16位。
在C语言标准库头文件float.h定义了浮点数小数点后的有效位数 :<pre t="code" l="cpp"> //float.h头文件的部分代码
#define DBL_DIG 15 //双精度小数点后15位
#define FLT_DIG 6 //单精度小数点后6位
#define LDBL_DIG 19 //长双精度小数点19