2010-10-17 257 views
1

我在C++中有一個浮點數,並且數字可以採用不同的形式,例如, 355.5或9.9(這是從測試代碼輸入的)。將C++中的浮點數舍入到一位小數

我有一個函數,它是

float return_max(angle_set_t *angles) 
{ 
    float val; 
    float max; 
    max= angles->key; 
    while(angles != NULL) 
    { 
     val= angles->key; 
     if(max<=val) 
     { 
      max=val; 
     } 
     angles = angles->right; 
    }  
    return max; 
} 

max可以是一個浮點值。我想將值舍入到小數點後一位。

我需要一個通用的解決方案,因此適用於355.555555和9.999999

float first_aset() 
{ 
    //do somethig 
    result=return_max(); 
    return result; 
} 

void main() 
{ 
    if(first_aset(S, 357.0, 20.0) != 9.9 || 
     first_aset(T, 357.0, 20.0) != 9.9) 
    { 
     printf("Error in wrap-around interval (3)\n"); 
     printf(" first in interval [357, 20) in S is %f, should be 9.9\n", 
     first_aset(S, 357.0, 20.0)); 
     printf(" first in interval [357, 20) in T is %f, should be 9.9\n", 
     first_aset(T, 357.0, 20.0)); 
    } 
} 

在這裏是problem..the結果是:在環繞間隔(3)

錯誤

S中的區間[357,20)中的第一個是9.900000,應該是9.9

在T中的區間[357,20)中的第一個是9 0.900000,應該是9.9

+0

您是否需要四捨五入來顯示給用戶的值,或者您是否需要執行進一步的計算,以便將值舍入?你有一個特定的四捨五入策略嗎? (有多種方法可以舍入一個數字。) – 2010-10-17 04:30:14

+0

furhter的計算 – abbas 2010-10-17 04:32:23

+0

爲什麼你認爲舍入在這裏是個好主意?在這種情況下,「十進制數字」的意義是什麼?爲什麼不僅以更高的精度生活併爲此感到高興呢? – fredoverflow 2010-10-17 13:52:13

回答

5

answer = static_cast<float>(static_cast<int>(number * 10.))/10.; 

反之,如果你只是想顯示與精度值,嘗試setprecision

cout << setprecision(1) << number << endl; 

在你的代碼是比較float和double。這隻能嚴重結束(與任何浮點比較一樣)。它如果你比較9.9f

+0

對於任何數字<= 360,這肯定會工作正常。然而,它在技術上並不是一個「通用解決方案」,因爲'number * 10'部分在應用於非常大的浮點時會引入其自己的舍入誤差(因爲10不是功率2)。 – AlcubierreDrive 2010-10-17 04:31:37

+0

但我需要它的浮動不雙打。 – abbas 2010-10-17 04:33:03

+0

@abbas A double是一個具有更多存儲容量的浮點數。 – AlcubierreDrive 2010-10-17 04:33:36

4
rounded = truncf(original * 10)/10; 

但是可能(很少)的工作,我和Ben同意,你絕對不應該被檢查確切的不平等。如果需要比較,請使用epsilon

+0

也將它除以10。那將會截斷而不是圓整......取決於他是否想要這樣做。 – JoshD 2010-10-17 04:33:17

+0

它會被所有數字355.55555以及9.9999999 – abbas 2010-10-17 04:35:01

+0

@Josh除以十,從他想要截斷的例子中可以清楚地看出。 – 2010-10-17 04:36:22

0

作爲一個側面說明,你似乎是建立自己的(侵入)鏈表。 C++已經爲您提供了各種容器,如vectorlist。此外,您不必編寫一個函數來確定序列中的最大值,只需使用標準庫中的適當算法即可。

#include <vector> 
#include <algorithm> 

std::vector<float> angles = {0.0, 355.5, 9.9}; 
float maximum = *std::maximum_element(angles.begin(), angles.end());