⑴ 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