2012-09-04 20 views
1

我在C.如何確定數字中的小數位數?

寫一個程序是否有確定的浮動小數位數 的數量(即0.123 = 30.123456 = 6等)的方法嗎?

除了將數字轉換爲字符串和使用字符串 函數拉小數點後的字符?

我有一個名爲computeFare()函數

float computeFare() 
{ 
    totalFare = (3.40 + basicFare) * (1 + surchargePercent); 
    return totalFare; // **in this case totalFare = 34.567** 
} 

printf("Total fare is $%.2f\n", 
      computeFare()); 

結果:總票價爲$ 34.56

我做到這一點,它返回34.56 ... 我想這是$ 34.57

謝謝, 勞倫斯。

+1

你想解決什麼問題? –

+1

看看這個鏈接 http://stackoverflow.com/questions/1083304/cc-counting-the-number-of-decimals – 2012-09-04 12:41:26

+0

浮動computeFare() { totalFare =(3.40 + basicFare)*(1 + surchargePercent ); return totalFare; //在這種情況下totalFare = 34.567 } 的printf( 「總票價是$%2F \ n」。, \t \t \t computeFare()); 我做了這個,它返回了34.56 ... 我希望它是$ 34.57 –

回答

5

不是,小數位數是數字內部表示的函數。當您顯示數字時,您看到的是打印字符串的數字。

因此,如果您對顯示的數值感興趣,您可以通過格式化指令來控制小數位數,例如%5.2f,或者您可以使用字符串函數方法將該數字作爲字符串。

此外,作爲一邊,你會計算尾隨零?

也許這會有助於說明你想要做到這一點的目標?可能還有其他方法可以完成您正在尋找的任務。

更新

根據您的更新,這個問題真的不算小數,而你正在運行到represenation問題/舍入誤差(不是少見)。問題是某些小數值不能用基數2精確表示。下面是一個詳盡的解釋:What Every Computer Scientist Should Know About Floating-Point Arithmetic

在這太問題請看:Understanding floating point representation errors; what's wrong with my thinking?

你可以試試這個方法來舍入值:

float rounded_val = floorf(value * 100.0 + 0.5)/100.0; 

Wikipeadia對rounding整篇文章。

+0

float computeFare() totalFare =(3.40 + basicFare)*(1 + surchargePercent); return totalFare; //在這種情況下totalFare = 34.567 } 的printf( 「總票價是$%2F \ n」。, \t \t \t computeFare()); 我做到了這一點,它返回34.56 ... 我希望它是$ 34.57 –

+0

我無法真正從評論(格式化在這裏很難,更好地更新您的帖子)告訴,但在我看來,你正在運行事實上,給定基數2表示的浮點值的二進制表示可能會給你一些小錯誤。有些小數值不能用2來完全表示。 – Levon

+0

我更新了上面的代碼。請看看:) –

2

With printf您可以指定小數位數。

  • %.0f等於沒有小數位
  • %.4f等於浮表示四位小數
+0

float computeFare() totalFare =(3.40 + basicFare)*(1 + surchargePercent); return totalFare; //在這種情況下totalFare = 34.567 } 的printf( 「總票價是$%2F \ n」。, \t \t \t computeFare()); 我做到了這一點,它返回34.56 ... 我希望它是$ 34.57 –

4

數字將(通常)被存儲在基座2,所以分數不大可能精確對應於簡潔十進制串。爲了得到整齊的小數,你可能必須先舍入。

+2

只是爲了澄清,一個數字爲0。1(十進制)不能完全表示爲浮點數。所以如果你把它轉換成一個字符串(例如sprintf()),你可能會得到「0.1」,或者你可能會得到「0.10000000149011612」。因此,一個簡單的'計算小數點右側的數字'算法可以給出一個截然不同的答案,完全取決於sprintf()如何取整非精確數字。 –

1

答:我不這麼認爲。即使你可以得到mantisa(指數值),它將在基數2中。
B.此外,浮動數字不準確,所以最有可能的是,如果你沒有一個完美的圓數,你有無限數量的小數位。當你打印數字時,你不會看到它們,因爲正在裁剪。

0

在您最近的編輯之後,它聽起來像是你只想四捨五入,而不是說你真的關心數字中的小數位數。

如果是這樣,你可以使用這樣的代碼的情況下:

#include <math.h> 

float computeFare() 
{ 
    float totalFare; 
    totalFare = (3.40 + basicFare) * (1 + surchargePercent); 
    totalFare = floorf(totalFare * 100 + 0.5)/100; //round the answer 
    return totalFare; // **in this case totalFare = 34.567** 
} 
printf("Total fare is $%.2f\n",    computeFare()); 
相關問題