带有浮点数的std :: cout

时间:2015-11-22 12:34:02

标签: c++

我正在使用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 ++规范是否允许显示浮点数的任何内容?

3 个答案:

答案 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

所以我猜你的问题已经解决了!