在小数位后跳过了数字

时间:2014-02-26 10:46:43

标签: c++

我已将integer分配给double变量,但cout将双变量打印为int。不是double。如果我在代码中引入cout << showpoint;,那么我可以在输出处看到小数值。为什么在第一种情况下呢?这是代码。

#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

3 个答案:

答案 0 :(得分:5)

默认情况下,浮点类型只有在需要时才会显示小数点。如果它们具有整数值,则显示它们时没有。

如您所知,如果需要,可以使用showpoint更改此行为(并使用noshowpoint更改回来)。

答案 1 :(得分:1)

答案似乎与您发布的链接相同。只是cpp标准(我的意思是std流)默认情况下禁用尾随零的打印。

答案 2 :(得分:1)

根本原因只是因为那是标准 说。由于历史原因,定义了C ++输出格式 就C和printf格式而言。默认情况下,浮动 使用%g格式输出点,这是一种自适应格式 格式,也根据所涉及的值而变化 根据各种格式标志。对于类似的 历史原因:默认格式将抑制尾随 点后的零,如果之后没有数字 一点,它也会压制这一点。如果你指定 showpoint,结果相当于%#g,而不是std::cout.setf( std::ios_base::fixed, std::ios_base::floatfield ); 无论如何,只会导致显示该点 导致显示尾随零。

实际上,这种默认格式几乎不是你想要的 用于实际节目输出;它唯一真正用于调试,和 各种“信息”输出。如果你想要固定点,用 在点之后的固定小数位数,您必须指定 它:

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}}

在生产代码中不是您想要的东西(因为您不想这样做) 指定输出数据时的格式,但是 对于快速的一次性程序非常有用。