在我之前的问题中,我打印了一个double using cout,当我没有预料到它时,它变得圆润了。我如何才能使cout打印一个双重使用全精度?
当前回答
在c++ 20中,你可以使用std::format来做到这一点:
std::cout << std::format("{}", M_PI);
输出(假设双IEEE754):
3.141592653589793
默认浮点格式是具有往返保证的最短十进制表示形式。与setprecision I/O操纵符相比,这种方法的优点是它不会打印不必要的数字。
在此期间,您可以使用{fmt}库,std::format是基于。{fmt}还提供了print函数,使这更容易和更有效(godbolt):
fmt::print("{}", M_PI);
免责声明:我是{fmt}和c++ 20 std::format的作者。
其他回答
最轻松的……
#include <limits>
using std::numeric_limits;
...
cout.precision(numeric_limits<double>::digits10 + 1);
cout << d;
最好的选择是使用std::setprecision,解决方案是这样的:
# include <iostream>
# include <iomanip>
int main()
{
double a = 34.34322;
std::cout<<std::fixed<<a<<std::setprecision(0)<<std::endl;
return 0;
}
注意:您不需要使用cout。我在std::setprecision处填充0,因为它必须有一个参数。
以下是我会使用的方法:
std::cout << std::setprecision (std::numeric_limits<double>::digits10 + 1)
<< 3.14159265358979
<< std::endl;
基本上,限制包具有所有内置类型的特性。 浮点数(float/double/long double)的特征之一是digits10属性。这定义了以10为基底的浮点数的精度(我忘记了确切的术语)。
参见:http://www.cplusplus.com/reference/std/limits/numeric_limits.html 查看其他属性。
c++ 20 std::格式
这个伟大的c++库新特性的优点是不会像std::setprecision那样影响std::cout的状态:
#include <format>
#include <string>
int main() {
std::cout << std::format("{:.2} {:.3}\n", 3.1415, 3.1415);
}
预期的输出:
3.14 3.142
正如https://stackoverflow.com/a/65329803/895245中提到的,如果不显式传递精度,它会打印带有往返保证的最短十进制表示。TODO更详细地了解它与:dbl::max_digits10的比较,如https://stackoverflow.com/a/554134/895245中显示的{:.{}}:
#include <format>
#include <limits>
#include <string>
int main() {
std::cout << std::format("{:.{}}\n",
3.1415926535897932384626433, dbl::max_digits10);
}
参见:
返回c++中的默认浮点打印精度,以了解如何恢复pre-c++20中的初始精度 Std::string格式,如sprintf https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification
这将显示点后小数点后两位的值。
#include <iostream>
#include <iomanip>
double d = 2.0;
int n = 2;
cout << fixed << setprecision(n) << d;
看这里:定点符号
std::固定
使用固定浮点符号设置的浮点字段格式标志 STR流的固定。 当floatfield设置为fixed时,将写入浮点值 使用定点表示法:值完全用as表示 由精度字段指定的小数部分中的多个数字 (精度)和无指数部分。
标准::设置精度
Set decimal precision设置格式化时使用的十进制精度 输出操作上的浮点值。
如果您熟悉表示浮点数的IEEE标准,就会知道在标准范围之外完全精确地显示浮点数是不可能的,也就是说,它总是导致实际值的四舍五入。
您需要首先检查该值是否在作用域内,如果是,则使用:
cout << defaultfloat << d ;
std:: defaultfloat
使用默认浮点符号设置floatfield格式标志 为STR流设置defaultfloat。 当floatfield设置为defaultfloat时,浮点值为 使用默认表示法编写:表示使用尽可能多的表示法 需要的有意义的数字,直到流的十进制精度 (精度),同时计算小数点前后的数字 点(如果有的话)。
这也是cout的默认行为,这意味着您没有显式地使用它。