#include<stdio.h>
main()
{
int a,b;
float f;
scanf("%2d%3d%4f",&a,&b,&f);
printf("%d %d %f",a,b,f);
}
當我運行該程序和輸入2 4 56.8,它使輸出2 4 56.799999 ...但我期望2 4 56.8 ....爲什麼如此?
#include<stdio.h>
main()
{
int a,b;
float f;
scanf("%2d%3d%4f",&a,&b,&f);
printf("%d %d %f",a,b,f);
}
當我運行該程序和輸入2 4 56.8,它使輸出2 4 56.799999 ...但我期望2 4 56.8 ....爲什麼如此?
這是正確的。浮點數是近似值。正如0.33333333近似於1/3,56.7999999近似爲56.8。 0.1沒有精確的浮點表示。
見一些已被寫入:
謝謝wallyk先生...... –
@SUMITGUPTA - 如果這能正確回答您的問題,請考慮標記爲'正確'。閱讀[如何](http://meta.stackexchange.com/a/5235/179533) – ArjunShankar
56.8是不是在你的C編譯器使用的浮點格式完全相同,表示的。 請參閱每位計算機科學家應瞭解的有關浮點運算的知識(1991)作者:David Goldberg。
它可能與浮點不準確有關。
由於浮點數域的連續空間被映射到離散級別,所有浮點數都不能存儲爲其精確值。例如,浮點數可以存儲在IEEE754單精度格式中。它將浮點數以三部分的形式存儲在32位內存中。假設[a, b]
是兩個最接近的浮點數,可以完全用IEEE754格式表示,但我們將有無限數量的浮點數在a
和b
之間,在這種情況下,這些數字將近似爲a
或b
。這會導致您正在經歷的不精確。
該數字以標準化格式存儲,儘管某些非常小的數字可以非標準格式存儲。只要看看這些文件。
例如,在你的情況56.8 IEEE754單點精度表示將如下:
現在,如果這個數字轉換回十進制然後你
因此,當你檢索值從IEEE754單精度格式它變爲:56.799999237您已存儲的位置56.8
您可以在此處使用IEEE754表示形式:http://www.h-schmidt.net/FloatConverter/IEEE754.html
不是'printf''「%f」'期望一個'double'? –
我認爲它可以同時適用於浮動和雙重... –
@FlorianSowade,是的,但浮動參數被提升爲雙倍的函數沒有原型和可變參數。 – AProgrammer