带有浮点数的 std::cout

std::cout with floating number

提问人:Daniel Laügt 提问时间:11/22/2015 最后编辑:MilanDaniel Laügt 更新时间:5/19/2022 访问量:60721

问:

我正在使用 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

为什么打印出来的值?ANSI C++ 规范是否允许在没有使用时显示浮点数的任何内容?123457123456.789std::coutstd::setprecision()

C++语言

评论

4赞 Mats Petersson 11/22/2015
“当 std::cout 在没有 std::setprecision() 的情况下使用 std::cout 时,ANSI C++ 规范是否允许显示浮点数的任何内容?” 是的,它确实如此。
0赞 Daniel Laügt 11/22/2015
@Hermantas,我的意思是std::cout。
0赞 Daniel Laügt 11/22/2015
@Mats,为什么规范在这个问题上如此模糊?如果规范更具体(例如打印带有有效数字的浮点数),这将对开发人员有所帮助。类似于 printf(“%.16g\n”, d)。
1赞 Bo Persson 11/22/2015
默认精度为 6,就像 printf 一样。
0赞 Daniel Laügt 11/22/2015
@Bo,右边的 std::cout.precision() 给出 6。因此,规范定义明确。谢谢。

答:

3赞 Mats Petersson 11/22/2015 #1

我认为这里的问题是 C++ 标准不是为了易于阅读而编写的,它是为了精确而不是重复自己而编写的。因此,如果您查找 ,除了“它使用 - 因为这就是实现方式”之外,它没有说任何其他内容。operator<<(double)num_putcout << some_float_value

默认行为是什么[n3337版本的C++标准中的表88解释了printf和c++格式的等效性]。因此,如果要这样做,则需要通过调用 .print("%g", value);%.16gsetprecision(16)

12赞 Ankit Acharya 11/22/2015 #2

你所指出的实际上是标准化委员会应该考虑的关于C++的许多事情之一。当你写的时候,这样的事情效果很好:-standard iostream

printf ("%f\n", d2);

但不是你需要使用的地方,因为它的格式类似于 而不是 in 的用法。所以你需要写:-std::coutstd::setprecision%g%fprintf

std::cout << std::setprecision(10) << "value2: " << d2 << std::endl;

但是如果你不喜欢这个方法&使用C++11(&以后),那么你也可以写:-

std::cout << "value2: " << std::to_string(d2) << std::endl;

这将为您提供与 相同的结果。printf ("%f\n", d2);

一个更好的方法是通过使用以下方法取消四舍五入:-std::coutstd::fixed

#include <iostream>
#include <iomanip>
int main()
{
    std::cout << std::fixed;
    double d = 123456.789;
    std::cout << d;
    return 0;
}

输出:-

123456.789000

所以我想你的问题解决了!

评论

0赞 Daniel Laügt 11/22/2015
右,printf (“%f”, d) 显示一个带有 6 位十进制数字的浮点数。std::cout 显示最多 6 位数字(包括小数点前后的数字)的浮点数。我很困惑,因为我不知道这个默认精度。现在一切都清楚了......谢谢。
0赞 Juan 12/14/2019
有趣的是,我没有意识到 printf 的浮点参数实际上是双精度的。
12赞 incomplet_ 11/22/2015 #3

四舍五入的发生是因为 C++ 标准,这可以通过编写来查看std::cout<<std::cout.precision();

输出屏幕将显示该语句将打印的默认有效位数为 。这就是为什么它会自动将浮点数四舍五入为 6 位数字的原因。6std::cout6