c++ - boost格式设置浮点的最大精度
问题描述
我基本上有以下几点:
typedef TFp double;
boost::format fmt("Floating point: %2$f");
TFp v = 0.000000001;
fmt % v;
std::cout << fmt.str();
根据 boost 格式手册,默认情况下输出 6 位精度,因此显示 0.000000,我的用户将其解释为 0(我什至不能怪他们这么想)。我可以修改我的格式字符串并在美元符号后添加一个点和一个数字来固定位数,但是这个数字可能会根据浮点值的大小而变化,并且由于我的代码的一些特殊性,我在示例中(加倍)的 typedef 有时是浮点数,因此我必须在格式字符串中再次使用不同的数字。
基本上我正在寻找一种方法来告诉 boost 格式'给我尽可能多的数字来显示任何浮点类型的值,但不要更多(即,当值为 0.003 时,它不应该打印 0.003000 或其他)。
我认为这是一件显而易见的事情,我花了两次仔细阅读文档才发现它不是默认的(正如在某些地方暗示的那样),但我找不到办法做到这一点.
解决方案
我认为f
格式说明符不可能,因为后者总是产生尾随零。但是,您可以使用g
17 的说明符和精度,double
这将去除尾随零并且不会丢失精度(提供 IEE754 double
)。这有一个不幸的副作用,在某些情况下会产生比需要更多的数字,例如0.1
将被格式化为0.10000000000000001
.
如果您不限于 Boost 格式,那么您可以使用一种格式工具来为您提供最短的十进制表示。例如,{fmt} 库默认执行此操作:
auto s1 = fmt::format("{}", 0.000000001);
// s1 == "1e-9"
auto s2 = fmt::format("{}", 0.1);
// s2 == "0.1"
免责声明:我是 {fmt} 的作者。
推荐阅读
- jboss - java.lang.RuntimeException: RESTEASY013050: RESTeasy Provider Factory 为空,您是否配置了 ResteasyBootstrap 侦听器?
- bbedit - 如何为文档设置语法着色?
- c# - 具有相同类型的多对多和一对多关系
- c# - 如何使用 C# 检查单元 (C:) 脏位
- c - Linux消息发送方和接收方执行错误(重复错误)
- javascript - 使用 chai-http 测试的测试没有运行
- javascript - 在'beforeunload'函数之前反应状态变量神秘地变化
- javascript - 这是什么错误?尝试使用带有回调的 API
- dictionary - Flutter - 如何在我的未来构建器文本小部件中获得价值回报
- swift - 将文本从 UITextView 保存到领域(Swift 5)时出现问题