我已将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
答案 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}}
在生产代码中不是您想要的东西(因为您不想这样做) 指定输出数据时的格式,但是 对于快速的一次性程序非常有用。