2013-05-25 88 views
2

我想在小數點後僅打印一位數字。當打印到cout時舍入一個雙數

所以我寫:

double number1 = -0.049453; 
double number2 = -0.05000; 

cout.setf(ios::fixed,ios::floatfield); 
cout.precision(1); 

cout << number1 << endl; 
cout << number2 << endl; 

我的輸出是:

-0.0 
-0.1 

我想,第一行會0.0(原因-0.00.0)。我應該如何更改我的代碼,在-0.0的情況下,它會打印0.0

而關於第二行,爲什麼不打印0.0(或-0.0)?

任何幫助表示讚賞!

回答

1

要打印浮點數,如果它們大於或等於兩個可能的輸出的「中間」,它們會四捨五入,因此-0.05有意地變爲-0.0

如果負數也被有意舍入爲零,則結果爲負數。內部浮點格式(IEEE 754)區分負數和正數零(see this link),並且似乎C++輸出流遵循此行爲。

您可以通過分隔打印符號和浮點數的絕對值來克服這兩個問題。

cout << (number <= -.05 ? "-" : "") << abs(number); 

說明的比較:對於等於或大於-0.05更小的數字,四捨五入abs(number)(其然後>= 0.05)將是非零的,因此,只有那麼想要的符號出現。

請注意,此比較中的閾值取決於您選擇的輸出格式。所以你應該保持這種打印方法儘可能地在你的代碼中,在那裏你知道你想要打印浮動指針的確切格式。

Live example

注:floatdouble行爲如出一轍關於這幾點。