2011-05-16 31 views
-3

嘿所以我正在返回有小數,整數,或總數的數的函數,但一直未能使其與以下任一方式工作:如何計算一個大雙數中有多少個小數位?

  • 乘以一個真正大量像10十億不會因爲innacurate路電腦店小數的工作,使2.3 2.2999575697

  • 使用字符串流將數字轉換爲字符串,並計算字符不起作用,因爲它要求您將流設置爲精確度如果未設置爲實際的小數位數,則要麼帶走要麼添加不需要的'0'字符

那麼我現在該做什麼?有人請幫助=(感謝

,如果你想看到我的函數的麻木轉換爲字符串在這裏它是:

//////////////////////  Numbs_Digits //////////////////////////////////////////////// 
template<typename T> 
int Numbs_Digits(T numb, int scope) 
{ 
    stringstream ss(stringstream::in| stringstream::out), ss2(stringstream::in| stringstream::out); 
     unsigned long int length= 0; 
     unsigned long int numb_wholes; 
          ss2 << (int)numb; 
          numb_wholes = ss2.str().length(); ss2.flush(); 
     bool all= false; 
     ss.precision(11); // HOW DO I MAKE THE PRECISION NUMBER THE NUMBER OF DECIMALS? 

    switch(scope){ 
     case ALL:  all = true; 

     case DECIMALS: ss << fixed << numb; 
         length += ss.str().length()- (numb_wholes +1); // +1 for the "." 
         if(all!= true) break; 

     case WHOLE_NUMBS: 
         length += numb_wholes; 
         if(all!= true) break; 

     default: break;} 

     return length;}; 
+3

而不是給我們你的示例代碼,它可能會更好,如果你能給出一個更清晰的問題描述。請提供一些數字和你期望的結果的例子。 – 2011-05-16 01:37:19

+2

從你以前的問題來看,我建議閱讀浮點實際工作原理。那麼你就會明白爲什麼「雙數中的小數」沒有多大意義。 – hammar 2011-05-16 01:44:14

+0

可能使用http:// stackoverflow。com/questions/4738768/printing-double-without-losing-precision – ThomasMcLeod 2011-05-16 03:42:07

回答

2

只有一些十進制數可以以精確形式存儲爲浮點數。由於這個原因,沒有辦法確定對於任何十進制數來說,有多少小數位是非常重要的,這是不正確的。作爲哈馬爾建議,在浮點存儲格式讀了,我相信每個程序員都應該有這樣的低層次的東西的一些知識:d

乘以一個真正大量像10十億,因爲不工作的計算機存儲小數的方式,使得2.3 2.2999575697

這正是問題所在。你能看看2.999575697並告訴我它有兩位小數?這個數字是一個十進制數的例子,不能以浮點格式以精確的形式存儲。你可以做的最好的方法是計算浮點數中存儲的重要小數位數,它最接近它給出的原始十進制數 - 這是我無法想象的多大用處。

編輯更準確的解釋。

+1

二進制浮點數是一個精確的表示,它只是有一些分數可以用有限小數表示,但不能用有限二進制表示。 – phoog 2011-05-16 02:39:07

+0

雙精度數字包含52位重要的二進制數字或15.95位重要的十進制數字(53記錄2)。但是,最多需要17位十進制數來區分相鄰的double值。 – ThomasMcLeod 2011-05-16 03:40:47

+0

@phoog我應該使用措辭:浮點數不能是一些十進制數的精確表示。這個問題在任何解決這個問題的解決方案中都會經常出現,試圖解決這個問題並沒有太多的收穫。 – Snyex 2011-05-16 04:05:58

3

如果你想知道的十進制數字,一個最大數量long double可以存儲,這個值是在cfloat定義的恆定LDBL_DIG可用。請注意,此數目實際上是一個近似爲值被存儲在二進制內部,因此值的範圍不是10.

0

功率你可以嗎不要將ios_base精度設置爲cfloat.h中平臺上有效位數的最大位數,然後使用ios_base::setf()將浮點格式更改爲科學值,這將刪除浮點數中的任何尾隨零(您將只需要將指數修剪掉)?

相關問題