提问人:Daniel Laügt 提问时间:11/22/2015 最后编辑:MilanDaniel Laügt 更新时间:5/19/2022 访问量:60721
带有浮点数的 std::cout
std::cout with floating number
问:
我正在使用 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++ 规范是否允许在没有使用时显示浮点数的任何内容?123457
123456.789
std::cout
std::setprecision()
答:
我认为这里的问题是 C++ 标准不是为了易于阅读而编写的,它是为了精确而不是重复自己而编写的。因此,如果您查找 ,除了“它使用 - 因为这就是实现方式”之外,它没有说任何其他内容。operator<<(double)
num_put
cout << some_float_value
默认行为是什么[n3337版本的C++标准中的表88解释了printf和c++格式的等效性]。因此,如果要这样做,则需要通过调用 .print("%g", value);
%.16g
setprecision(16)
你所指出的实际上是标准化委员会应该考虑的关于C++的许多事情之一。当你写的时候,这样的事情效果很好:-standard iostream
printf ("%f\n", d2);
但不是你需要使用的地方,因为它的格式类似于 而不是 in 的用法。所以你需要写:-std::cout
std::setprecision
%g
%f
printf
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::cout
std::fixed
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::fixed;
double d = 123456.789;
std::cout << d;
return 0;
}
输出:-
123456.789000
所以我想你的问题解决了!
评论
四舍五入的发生是因为 C++ 标准,这可以通过编写来查看std::cout<<std::cout.precision();
输出屏幕将显示该语句将打印的默认有效位数为 。这就是为什么它会自动将浮点数四舍五入为 6 位数字的原因。6
std::cout
6
评论