2015-08-26 114 views
-3

使用浮點值我不知道爲什麼我的C編譯器或系統意外行爲。沒有讓它變得如此混亂。這裏是一個簡單的程序,用於輸入浮點值並打印。浮點值輸入錯誤

#include <stdio.h> 

int main() 
{ 
    float num; 

    printf("Enter float value "); 
    scanf("%f", &num); 

    printf("Value = %f", num); 

    return 0; 
} 

在多次運行相同的代碼給我不同和怪異的輸出。以下是一些示例運行。

樣品試驗#1 正確的輸出

輸入浮點值12.0312
值= 12.031200

樣品試驗#2 不正確的和意想不到的輸出

輸入浮點值324.123
值= 324.122986

樣品試驗#3 錯誤和意外的輸出

輸入浮點值945.1234
值= 945.123413

我不知道爲什麼系統在最後添加一些垃圾值。我在code :: blocks中使用GNU GCC編譯器。

+3

系統不是」添加垃圾數值「。浮點表示本質上不精確(它們不代表實數,它們表示有理數的子集)。 –

+0

http://floating-point-gui.de/ – pm100

+0

感謝大家明確表示。併爲鏈接。這是我發現我的問題的正確答案http://stackoverflow.com/questions/588004/is-floating-point-math-broken。如果其他人有這個問題,這個鏈接可以幫助。 –

回答

3

你的float不能準確地代表每一個可以想象的數字。它有侷限性。最接近的float"324.123"324.122986...

如果您需要更高的精度,請使用double,但即使這也有其限制。

A float將是正確的(匹配類似限制的輸入)至少FLT_DIG顯着數字。要打印的數FLT_DIG顯著位數使用:

printf("%.*e", FLT_DIG - 1, num); 

FLT_DIG是至少爲6。

號碼的十進制數字,Q,使得其中q十進制數字任何浮點數可以四捨五入成爲一個帶有p基數b位數的浮點數,然後再次返回而不改變爲q十進制數,... C11dr§5.2.4.2.211

+0

是否存在['std :: numeric_limits :: max_digits10'](http://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10)的C等價物? – legends2k

+0

@ legends2k是的。看起來'max_digits10'就像'FLT_DECIMAL_DIG/DBL_DECIMAL_DIG','digits10'就像'FLT_DIG/DBL_DIG'。 – chux

+0

C11似乎只有[DECIMAL_DIG](http://en.cppreference.com/w/c/types/limits)。然而,如果需要的話,可以定義一個宏,所以應該沒問題,我猜。 – legends2k

1
printf("Value = %f", num); 

如果需要,它會增加一些值: 輸入浮點值945.1234 值= 945。123413

因爲浮點值始終在小數點後打印6位

避免這種情況,你可以使用語句,如: 的printf( 「VALUE =%.3f」,NUM);

這會給你一個願望輸出,只要你想 將小數點 你可以設置按您的要求像 「%.2f」後打印只有三個數字 - 小數點後 > 2號「 %.3f「 - >爲小數點後面的3位數字 」%.4f「 - >爲小數點後面的4位數字