2013-11-24 27 views
0

以下是KN King現代編程方法練習的解決方案代碼。針對浮點值的額外精度值

#include<stdio.h> 

int main(void) 
{ 
    int i; 
    float j,x; 
    scanf("%f%d%f",&x,&i,&j); 
    printf("i = %d",i); 
    printf("x = %f",x); 
    printf("j = %f",j); 
} 

輸入:

12.3 45.6 789 

預期結果:

i = 45 
x = 12.3 
j = 0.6 

實際結果:

i = 45 
x = 12.300000 
j = 0.600000 

問:

爲什麼有見過花車額外的十進制值?是否有任何浮點默認精度設置,我怎麼能改變它(只有默認 - 我知道我可以使用格式化字符串來控制精度值在printf)。我在windows7上使用gcc(Mingw)。

+2

「爲什麼有見過花車額外的十進制值?」 - 因爲這就是'%f'說明符的工作原理。改用'%g'來代替。 – 2013-11-24 12:25:08

+0

@ H2CO3,如果我在'printf'中使用'%g',則顯示正確。那麼我可以查看float的默認精度集,在所有平臺上都是一樣的嗎? – sarbjit

回答

1

浮點格式記錄只有的數學值。他們沒有記錄掃描時(或以其他方式獲得的)值的精確度。 (就此而言,整數格式也是如此。)

當您顯示浮點值時,必須指定要顯示的位數。 C標準定義的六位數字默認爲%f說明符:

雙表示浮點數參數被轉換爲十進制表示在樣式[ - ] ddd.ddd ,小數點後面的位數等於精度規格。如果精度丟失,則取6;如果精度爲零並且沒有指定標誌,則不會顯示小數點字符。如果出現小數點字符,則至少出現一位數字。該值被四捨五入爲合適的位數。

可通過在格式規範的時段之後寫入的位數指定精度,如%.2f

精度採用週期的形式(。)之後是星號*(稍後描述)或可選的十進制整數;如果僅指定了週期,則精度被取爲零。

(星號用於指定傳遞給printfint參數中的位數。)


Ç2011(N1570)7.21.6.1 8.

Ç2011(N1570)7.21.6.1 4.

+0

這是否意味着'%g'會顯示掃描的值?根據http://linux.die.net/man/3/printf,對於'%g',如果缺少精度,則將使用6個精度,但看起來並不如此。 – sarbjit

+0

@arbjit:'%g'說明符表示使用固定或科學記數法來顯示數字,具體取決於其大小(以及指定的精度)。它不會更改爲精度指定的位數。 –

0

您無法更改浮點數的精度,但(如您所知,您可以更改浮點數的顯示精度)。

0

爲什麼有花車看到額外的十進制值嗎?

這就是浮動浮動的原因。默認情況下,%f可讓您在小數點後顯示6位數字。 這與存儲的數字的精度無關。數字在大多數系統中根據IEEE 754 FLOATING POINT表示進行存儲。數字不存儲小數點。所以,既然你不控制你如何存儲數字,你不能改變精度。精確度是固定的。

是否有任何浮動默認精度設置,我該如何改變它。

同樣,精度不是默認的,它不是如何存儲的。檢查其表示爲32位或64 bit.Youwould想打印多/少數字後decimal.You可以這樣做:

float i=2.89674534423; 
printf("%.10f",i); Prints 10 digits after decimal. 
0

雙不是無限精確的,並且它不存儲在十進制數,所以它不能精確地存儲0.085。如果要將數字打印爲兩位有效數字,請使用精度格式說明符 - 有關示例,請參見http://www.cprogramming.com/tutorial/printf-format-strings.html

double value = 0.085; 
NSLog(@"%.2g", value); 

這將打印「0.085」

注意,使用精度說明通常控制的小數點後顯示的數字位數 - 但在雙的情況下,控制顯著數字。

float value = 0.085; 
NSLog(@"%.2f", value); 

將打印 「0.09」