我有一个简单的C ++程序,我认为它会打印出f和g中定义的double值作为double ...但是C ++将它们打印为整数。我检查了cout的默认精度,当我运行它时输出显示默认精度应为6,所以我很困惑为什么双打不正确。
#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 = %f\n", f);
printf("[c] g = %f\n", 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 = %f\n", f);
printf("[c] g = %f\n", 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来强制打印双打?
答案 0 :(得分:8)
这是因为默认表示法和固定表示法之间的区别。
- 使用默认浮点表示法,精度字段指定要显示的有效数字的最大数量计算小数点之前和之后的数字。请注意,它不是最小值,因此如果数字的显示位数少于精度,则不会使用尾随零填充显示的数字。
- 在固定和科学记数法中,精确字段确切地指定在小数点后显示多少位数,即使这包括尾随小数零。在这种情况下,小数点前的数字与精度无关 (重点补充)。
流使用默认浮点表示法,直到(或除非)将其切换为固定或科学记数法。由于您的数字在小数点前有六位数,而默认精度也设置为六,因此浮点数看起来像整数。
答案 1 :(得分:3)
有三种浮点符号:
std::fixed
用于定点表示法。std::scientific
用于科学记数法。默认表示法只使用精度值来计算数字的所有数字,而不仅仅是小数部分。如果您使用短号码(如3.1415),您可以看到号码正确显示。
正如cplusplus.com documentation引用的那样,知道这一点也很有趣:
可以通过调用str。unsetf(ios_base::floatfield)来选择默认表示法。
P.S。:对于C ++ 11,有一些新的符号:十六进制hexfloat和之前所谓的(无)的defaultfloat。