C語言計算浮點數的小數字數,遮蔽掉了浮點運算的誤差

2021-06-23 01:22:15 字數 1019 閱讀 4491

問題是這樣的,輸入兩個浮點數,分別為矩形的width和length,求其面積area,並輸出顯示。本身這道題是沒什麼好說的,正常來說,只要 %f 就好,雖然後面的小數字數恆定為6位。但是答題後發現答案是會自動把多餘的0去掉的,這樣的話就沒辦法使用%.3f之類的來限定具體的小數字數了。於是這個就需要我們把結果area算出具體的的小數字數n,使用printf("%.*f",n,area);來顯示含

正確小數字數的浮點數area。

這裡面其實是有兩個問題的,導致他沒有辦法計算出正確的小數字數,甚至出現死迴圈的現象。

其中問題為:

1.上面的方法沒有考慮到小數點後面的數中間含有0的現象,比如說2.120056,這樣的話,如果用上述的方法,則會計算出小數字數為2,因為在計算到第位小數時為零,故而退出n的迴圈。

(這裡面網上是有解決方法的,方法為 f - (int)f  > (float)0.000001是否成立,若成立,則小數字數已計算完畢,若不成立,則繼續迴圈。但是這種方法依然會產生下面的2的問題,從而無法結束迴圈,得不到正確的結果);

2.上面的方法沒有考慮到浮點數的相乘是會產生誤差的,比如,

f = 2.123456;

s = f*10 ;// 結果為21.234560

s =s*10;//結果為212.2345603

這時就出現了誤差0.000003,故而會使程式無法結束迴圈。

於是思考好久之後,有了以下這種我的解決方法。

首先,我們是知道浮點型float的小數字數是為6位的,所以我們只要一開始就假定area是有6位小數,然後再逆轉判斷。具體程式如下:

int  float_n(float area)

return n;}

此時,n就是正確的小數字數了。

printf(" area = %.*f \n" , n , area);

可以正確顯示去除多於的零的area結果了。

目前我在思考第二種有效的方法,大家知道,所有的資料都是按照二進位制儲存在記憶體中的,那麼我們是否可以進行位運算 操作,來直接從float的儲存格式獲得小數的位數呢?

C 中保留浮點型小數字數問題

1.只要求保留n位不四捨5入 float f 0.55555f int i int f 100 f float i 1.0 100 2.保留n位,四捨五入 decimal d decimal.round decimal.parse 0.55555 2 3.保留n位四捨五入 math.round 0....

c語言整數轉浮點數 浮點數的秘密

我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...

c語言浮點數的體會

浮點數的型別分3類 1.float,單精度浮點數 占用4個位元組,表示範圍 3.4e 38 3.4e38 2.double,雙精度浮點數 占用8個位元組,表示範圍 1.7e 308 1.7e308 3.long double,長 雙精度浮點數 占用10個位元組,表示範圍 1.2e 4932 1.2e...