C++ COUT << [double] 不打印小数位
c++ cout << [double] not printing decimal places
我有一个简单的C++程序,我想它会打印出f和g中定义的双精度值作为双精度。。。但是C++将它们打印为整数。我检查了cout的默认精度,当我运行它时,输出显示默认精度应该是6,所以我很困惑为什么double没有正确打印。
#include <iostream>
#include <stdio.h>
int main() {
double f = 735416.416898;
double g = f + 0.3;
std::cout << "default precision is " << std::cout.precision() << std::endl;
std::cout << "[c++] f = " << f << std::endl;
std::cout << "[c++] g = " << g << std::endl;
printf("[c] f = %fn", f);
printf("[c] g = %fn", g);
f = 735416.516898;
g = f + 0.3;
std::cout << "[c++] f = " << f << std::endl;
std::cout << "[c++] g = " << g << std::endl;
printf("[c] f = %fn", f);
printf("[c] g = %fn", g);
return 0;
}
我看到的输出是:
kiran@kiran-VirtualBox:~/test$ g++ -o test test.cpp
kiran@kiran-VirtualBox:~/test$ ./test
[c++] f = 735416
[c++] g = 735417
[c] f = 735416.416898
[c] g = 735416.716898
[c++] f = 735417
[c++] g = 735417
[c] f = 735416.516898
[c] g = 735416.816898
因为默认精度显示为6,所以cout不应该也显示小数点后6位吗?
如果我做
std::cout << std::fixed << f
它打印正确(包括所有小数点)。
只是想知道是否有人能向我解释这种行为?这是意料之中的事吗?我是否应该使用std::fixed来强制正确打印双打?
这是因为默认表示法和固定表示法之间的区别。
根据文件,
- 使用默认的浮点表示法,精度字段指定总共显示的最大有意义数字数,包括小数点之前和之后的数字。请注意,它不是最小值,因此,如果显示的数字的位数少于精度,则它不会用尾随零填充显示的数字
- 在固定符号和科学符号中,精度字段精确指定小数点后显示的位数,即使这包括尾随小数零点。在这种情况下,小数点之前的数字与精度无关(增加了重点)
流使用默认的浮点表示法,直到(或除非)您将其切换为固定或科学表示法。由于您的数字在小数点之前有六位数字,并且默认精度也设置为六,因此浮点数看起来像整数。
有三种浮点符号:
- 用于定点表示法的
std::fixed
std::scientific
用于科学记数法- (none)默认表示法
默认的表示法只是使用精度值来计算数字的所有数字,而不仅仅是小数部分。如果您使用一个短数字(如3.1415),您可以看到该数字显示正确。
同样有趣的是,正如cplusplus.com文档所引用的,知道:
默认表示法可以通过调用str.unsetf(ios_base::floatfield)来选择
附言:对于C++11,有新的符号:hexfoat表示十六进制,defaultfloat表示之前的(none)。
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 呼叫运营商<<临时
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 过载输出<<用于类的运算符,以打印其中的元组
- 重载operator< & lt;作为会员打印
- 重载& lt; & lt;用于打印自定义异常的操作符
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串
- 什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值