2014-02-26 49 views
0

我已將integer分配給double變量,但cout將雙變量打印爲int。不是double。如果我在代碼中引入cout << showpoint;,那麼我可以在輸出中看到小數值。爲什麼在第一種情況下如此?這是代碼。cout跳過小數點後的數字

#include <iostream> 

using namespace std; 

template <class T> 

T sum(T a,T b) 
{ 
    T retval; 
    retval=a+b; 
    return retval; 
} 

int main() 
{ 
    double a,x; 
    float y,v=4.66; 
    int z(3); 
    x=z; 
    y=(double)z; 
    a=sum(5,6); 

    //cout << showpoint; 

    cout<<"The value of a is : "<<a<<endl; 
    cout<<"The value of x is : "<<x<<endl; 
    cout<<"The value of y is : "<<y<<endl; 
} 

在第一種情況下的輸出是

The value of a is : 11 
The value of x is : 3 
The value of y is : 3 

輸出在第二種情況下啓用cout<<showpoint後是

The value of a is : 11.0000 
The value of x is : 3.00000 
The value of y is : 3.00000 
+0

setprecision不存在,我編輯了問題 – blitz

+0

'showpoint'是什麼? – Raxvan

+0

@Raxvan:這裏是你可以得到答案的鏈接http://faculty.cs.niu.edu/~mcmahon/CS241/c241man/node83.html – blitz

回答

5

默認情況下,浮點類型僅與一個小數點顯示如果他們需要一個。如果他們有一個整數值,他們將顯示沒有一個。

如您所見,如果需要,您可以使用showpoint(並將其更改爲noshowpoint)更改此行爲。

+0

如果我說double var = 3.6787並且說cout << var它打印爲3.6787點後的數字不會被跳過。但爲什麼當一個整數被分配給一個double這會發生? – blitz

+2

@blitz:因爲這就是有多少人希望顯示一個整數值,所以這就是圖書館設計者決定默認應該表現的方式。如果你不喜歡默認行爲,使用'showpoint'來改變它。 –

+0

@MikeSeymour默認輸出格式是妥協;就像大多數的妥協一樣,它沒有什麼特別的好處,但是在許多快速代碼或者調試中它是可以接受的(即對於「正常」值是舒適的,但不管它的值是多少)。至於'showpoint',它在那裏,因爲C有'%#g';我想不出一個我真正使用它的案例。如果我關心格式,我會使用'fixed'或'scientific',然後從那裏繼續。 (如果精度爲0,'showpoint'會影響輸出的名稱爲'fixed'或'scientific'的方式)。 –

1

答案似乎是在您發佈的同一鏈路。只是,CPP標準(我的意思是標準流)打印的拖尾零默認情況下禁用。

1

的根本原因僅僅是因爲這是標準的 說什麼。由於歷史原因,C++輸出格式根據C和printf格式定義爲 。默認情況下,浮 點是使用%g格式,這是一種自適應 格式,根據所涉及,以及作爲 根據各種格式化標誌的值而改變的輸出。出於類似的 歷史原因:默認格式將打壓點之後尾隨 零,如果有在 點後無數字,它會抑制點爲好。如果指定了 showpoint,結果相當於%#g,而不是 只會導致顯示該點,不管如何,還會導致顯示尾隨零。

在實踐中,這種默認格式是幾乎從來沒有你想要什麼 真正的程序輸出;它唯一真正的用途是用於調試,以及各種「信息」輸出。如果你想固定點,用 點之後小數固定數量的,你必須指定 它:

std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); 

通常情況下,這將在某種手的書面 機械手來完成,從而使格式對於特定的語義值是 指定一次(在機械手),然後使用 操縱指定值的意義是 輸出,是這樣的:

std::cout << weight << someWeight; 

爲了快速,THR無需編碼,通常也有一些 類型的通用說明符;我有這樣的:

class FFmt 
{ 
    int myWidth; 
    int myPrecision; 
public: 
    FFmt(int width, int precision = 6) 
     : myWidth(width) 
     , myPrecision(precision) 
    { 
    } 
    friend std::ostream& operator<<(std::ostream& dest, FFmt const& fmt) 
    { 
     dest.setf(std::ios_base::fixed, std::ios_base::floatfield); 
     dest.precision(myPrecision); 
     dest.setw(myWidth); 
     return dest; 
    } 
}; 

(其實,我的版本是比較複雜的,因爲它是從 一個基類,它保存在 <<運營商目前的格式選項,並在析構函數恢復它們派生;因爲這種類 幾乎只用作臨時變量,這意味着在 充分表達的端部)

這支持寫入之類的東西:

std::cout << FFmt(9, 6) << x; 

不是你想要的產品代碼(因爲你不想 在輸出數據時指定了格式),但是 對於快速的一次性程序非常有用。