2015-11-06 66 views
0

我有一個情況:我怎樣才能得到一個雙精度值?

void foo(const double d) 
{ 
    const double rounded_2_decimals = std::round(d*100.0)/100.0; 
    std::cout << "d=" << d << std::endl; 
    std::cout << "r=" << rounded_2_decimals << std::endl; 
} 

打印時,d=3.125,但r=3.12而不是r=3.13

我懷疑是因爲d傳遞的其實是3.1249999 ....這就是爲什麼我把最初的清點,所以我可以看到在傳遞的「真」值。它顯示之前是否std::cout一輪值他們?我還有什麼可以看到通過的「真實」價值?

+0

我的壞,'round'總是舍入遠離零。使用'std :: setprecision',或者打印爲hexfloat。 –

+0

std :: round()的定義不是從零開始?有沒有辦法改變「舍入模式」? –

+0

你是對的(我錯誤的問題是'foo(3.125)'printing 3.12),然後沒有查找'std :: round',因爲對於這種行爲的唯一可能的解釋是四捨五入到偶數) –

回答

2

是的,std::cout確實是舍入值,但是您可以設置更高的精度。首先包含iomanip標題。然後:

void foo(const double d) 
{ 
    const double rounded_2_decimals = std::round(d*100.0)/100.0; 
    std::cout << "d=" << std::setprecision(9) << d << std::endl; 
    std::cout << "r=" << std::setprecision(9) << rounded_2_decimals << std::endl; 
} 

活生生的例子程序here

+0

訣竅是將std :: setprecision(9)與std :: fixed結合使用。 –

+0

'std :: fixed'不需要獲取「真實」值,因爲'std :: precision'足以提供更高的精度,指定覆蓋小數點兩側的最大位數。結果會忽略小於指定的最大位數的尾隨零。但是,如果你想要特定的格式,例如小數點後的固定數字位數,或者想要指定小數點後數字位數的精度,那麼是的,你可以將它與'std :: fixed'結合使用 – ccoder83

+0

謝謝,ccoder83。尾隨零的截斷使我走錯了路。增加'std :: setprecision()'中的值最終向我展示了我所懷疑的事實,即該值僅僅是小於0.5的頭髮。 –