2014-02-26 4 views
0

integerdouble 변수에 할당했지만 cout은 double 변수를 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; 
} 

제 경우의 출력은 두 번째 경우 cout<<showpoint를 활성화 한 후

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

출력이다 소수점 형식에만 소수점으로 표시되는 부동 기본적

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

내가 두 번 var = 3.6787 말을하고 cout << var 그것은 지점 다음에 3.6787로 인쇄되면 건너 뛸 수는 없지만 왜 정수가 double에 할당되면이 일이 발생합니까? – blitz

+2

@blitz : 정수 값을 표시해야하는 사람이 얼마나 될지 예상하기 때문에 라이브러리 디자이너가 기본적으로 동작해야한다고 결정한 방법입니다. 기본 동작이 마음에 들지 않으면'showpoint '를 사용하여 변경하십시오. –

+0

@MikeSeymour 기본 출력 형식은 손상입니다. 대부분의 절충과 마찬가지로 특별히 좋은 방법은 없지만 빠른 코드에서 또는 "디버깅"을 위해 허용되는 (즉, "정상적인"값에는 적합하지만 값에 관계없이 과도하게 길지는 않습니다). 'showpoint'에 관해서는 C가'% # g'을 가지고 있기 때문에 거기에 있습니다; 내가 실제로 사용하는 경우를 생각할 수 없다. 형식이 궁금하다면'fixed' 또는'scientific'을 사용하고 거기에서 계속 진행할 것입니다. ('showpoint'는 정밀도가 0 인 경우 그 이름이'fixed' 또는'scientific'을 나타내는 방식에 영향을줍니다.) –

1

답변은 게시자가 게시 한 동일한 링크에있는 것 같습니다. 그 cpp 표준 (std 스트림을 의미 함)은 기본적으로 비활성화 된 후미 0을 인쇄합니다.

1

근본적인 이유는 그게 표준 이 말하는 이유 때문입니다. 역사적인 이유로 C++ 출력 형식은 으로 C 및 printf 형식으로 정의됩니다. 기본적으로 부동 포인트는 적응 형 형식 인 %g 형식을 사용하여 출력됩니다.이 형식은 관련된 값에 따라 달라지며 다양한 서식 플래그에 따라 이됩니다. 비슷한 경우 역사적 이유 : 기본 형식은 후 점 0을 억제하고 점 뒤에 숫자가없는 경우 점을 표시하지 않습니다. showpoint을 지정하면 결과는 %#g과 동일하며 이 아니기 때문에 점에 관계없이 표시 될 뿐이며 은 후미 0을 표시합니다.

실제로이 기본 형식은 실제 프로그램 출력을 위해 을 거의 사용하지 않습니다. 유일한 실제 사용은 디버깅을위한 것이며, 다양한 "정보 제공"출력입니다.당신이 과 함께 지점 이후 소수의 고정 된 수의 고정 점을 원하는 경우에, 당신은 을 지정해야 함 :

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

일반적으로는, 이것은, 조작을 작성 손의 일종으로 수행 할 수 있도록 형식 특정 의미 값을 이 (매니퓰레이터에) 한 번만 지정하고, 당신은 출력, 같은 수의 값의 의미를 지정 조작을 사용 THR 빠른 들어

std::cout << weight << someWeight; 

, 코드가 없으므로 일종의 일반 지정자를 사용하는 것이 편리합니다. 내가 좋아하는 뭔가를 가지고 :

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; 

생산 코드에서 원하지 않는 것이 있습니다 (데이터를 출력하는 시점에서 형식을 지정하고 싶지 않으므로). 1 회성 프로그램에 매우 유용합니다.

관련 문제