c++ - 格式化浮点数:返回默认值
问题描述
在返回“默认格式”的意义上,我遇到了浮点值的格式问题。假设我有 2 个花车:
float f1 = 3.0f, f2 = 1.5f;
std::cout << f1 << " - " << f2 << "\n";
将显示为:3 - 1.5
现在,出于某种原因,我需要设置精度std::cout
(用于其他打印):
cout << std::precision(2);
如果我再次打印我的两个花车,这将导致:3.00 - 1.50
现在我想恢复默认格式。在 C++11 之前,这似乎很困难(或者是吗?)。但是,谢谢,我现在得到了这个新标志: std::defaultfloat。我们试试看:
std::cout << std::defaultfloat << f1 << " - " << f2;
将打印:3 - 1.50
。美好的。
哦,但是等等。说我有:
float f1 = 444.0f, f2 = 444.5f;
默认打印将显示:444 - 444.5
设置精度(和“固定”):
cout << std::precision(2) << std::fixed;
将会呈现:444.00 - 444.50
但回到“默认”:
std::cout << std::defaultfloat << f1 << " - " << f2;
将打印:(4.4e+02 - 4.4e+02
自动切换到科学格式)。而且,如果您想知道,附加“固定”标志将保持先前分配的精度,因此不会返回到原始设置。
问题:如何回到默认模式?
FWIW,实时代码在这里。
编辑:这个问题已被标记为欺骗,但链接的答案没有提供问题的答案,它只提到了如何获得当前的精度。
编辑 2:根据要求,这里是演示问题的完整代码:
int main()
{
float f1 = 444.5f, f2=443.0f;
std::cout << f1 << " - " << f2 << "\n";
std::cout << std::fixed << std::setprecision(2);
std::cout << f1 << " - " << f2 << "\n";
std::cout << std::defaultfloat;
std::cout << f1 << " - " << f2 << "\n";
}
结果:
444.5 - 443
444.50 - 443.00
4.4e+02 - 4.4e+02
解决方案
在 C++20 中,您可以使用std::format
无状态 API。特别是,在一个调用中指定精度不会影响另一个:
float f1 = 444.0f, f2 = 444.5f;
std::cout << std::format("{} - {}\n", f1, f2);
// Output: 444 - 444.5
std::cout << std::format("{:.2f} - {:.2f}\n", f1, f2);
// Output: 444.00 - 444.50
std::cout << std::format("{} - {}\n", f1, f2);
// Output: 444 - 444.5
std::format
尚未广泛使用,但您可以使用{fmt} 库,std::format
同时基于。它还提供了一个print
结合格式化和 I/O 的功能:
float f1 = 444.0f, f2 = 444.5f;
fmt::print("{} - {}\n", f1, f2);
// Output: 444 - 444.5
fmt::print("{:.2f} - {:.2f}\n", f1, f2);
// Output: 444.00 - 444.50
fmt::print("{} - {}\n", f1, f2);
// Output: 444 - 444.5
免责声明:我是 {fmt} 和 C++20 的作者std::format
。
推荐阅读
- javascript - 从函数参数中获取图像名称
- python - 检查其他 Dataframe 上是否存在值
- regex - 使 sed 正则表达式交替遵循从左到右的优先级?
- kubernetes - LoadBalancer 如何将流量转发到目标服务?
- php - 无法在服务或环境中使用发件人地址进行功能测试
- python - graphene-python 无法识别“content_type”字段
- javascript - 为什么“fs”只在程序结束后保留文件更改?
- amazon-ec2 - Aws 计费定价关闭服务器
- java - 通过微软的 Firebase 身份验证 - 登录选项卡未显示
- jqvmap - Jqvmap 动态选择区域