① 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類型,或者精度更高的,~~~好像有