我正在使用visual studio 2015来打印两个浮动数字:
double d1 = 1.5;
double d2 = 123456.789;
std::cout << "value1: " << d1 << std::endl;
std::cout << "value2: " << d2 << std::endl;
std::cout << "maximum number of significant decimal digits (value1): " << -std::log10(std::nextafter(d1, std::numeric_limits<double>::max()) - d1) << std::endl;
std::cout << "maximum number of significant decimal digits (value2): " << -std::log10(std::nextafter(d2, std::numeric_limits<double>::max()) - d2) << std::endl;
这将打印以下内容:
value1: 1.5
value2: 123457
maximum number of significant decimal digits (value1): 15.6536
maximum number of significant decimal digits (value2): 10.8371
为什么123457打印输出值123456.789?当没有std :: setprecision()使用std :: cout时,ANSI C ++规范是否允许显示浮点数的任何内容?
答案 0 :(得分:3)
由于可以通过编写看到C ++标准,因此发生了四舍五入
std::cout<<std::cout.precision();
输出屏幕将显示6,表示将由cout语句打印的默认有效位数为6.这就是为什么它会自动将浮动数字四舍五入为6位数。
答案 1 :(得分:2)
我认为这里的问题是C ++标准不是易于阅读,而是编写为精确而不重复。因此,如果您查找operator<<(double)
,除了“它使用num_put
之外,它不会说任何其他内容 - 因为这就是cout << some_float_value
的实现方式。
默认行为是print("%g", value);
的作用[n3337版本的C ++标准中的表88解释了printf和c ++格式的等价性]。因此,如果您想%.16g
,则需要通过调用setprecision(16)
来更改精度。
答案 2 :(得分:1)
你所指出的实际上是标准化委员会应该考虑的关于C ++ standard iostream
的许多事情之一。写这些东西时效果很好: -
printf ("%f\n", d2);
但不是std::cout
需要使用std::setprecision
,因为它的格式类似于%g
中使用%f
而不是printf
。所以你需要写: -
std::cout << std::setprecision(10) << "value2: " << d2 << std::endl;
但如果你不喜欢这种方法&amp;正在使用C ++ 11(及以后),你也可以写: -
std::cout << "value2: " << std::to_string(d2) << std::endl;
这将为您提供与printf ("%f\n", d2);
相同的结果。
更好的方法是使用std::cout
取消std::fixed
中的舍入: -
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::fixed;
double d = 123456.789;
std::cout << d;
return 0;
}
输出: -
123456.789000
所以我猜你的问题已经解决了!