c++ - boost 格式设置浮点的最大精度

标签 c++ boost boost-format

我基本上有以下内容:

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(我什至不能责怪他们这么想)。我可以修改我的格式字符串并在美元符号后添加一个点,然后添加一个数字来固定位数,但这个数字可能会有所不同,具体取决于 float 中的值有多大,并且由于我的代码的一些特殊性,我在我的示例中使用的 typedef(加倍)有时是一个 float ,所以我必须在我的格式字符串中再次使用不同的数字。

基本上我正在寻找一种方法来告诉 boost 格式'给我尽可能多的数字来显示任何浮点类型的值,但不能更多(即当值为 0.003 时,它不应该打印0.003000 或其他)。

我认为这是一件显而易见的事情,我花了两次非常仔细地阅读文档才发现它不是默认设置(正如在某些地方暗示的那样),但我找不到方法去做。

最佳答案

我认为使用 f 格式说明符是不可能的,因为后者总是产生尾随零。但是,您可以为 double 使用 g 说明符和精度 17,这将去除尾随零并且不会丢失精度(提供 IEE754 double ).这有一个不幸的副作用,在某些情况下会产生比必要更多的数字,例如 0.1 将被格式化为 0.10000000000000001

如果您不局限于 Boost 格式,那么您可以使用格式工具来提供最短的十进制表示形式。例如,the {fmt} library默认情况下这样做:

auto s1 = fmt::format("{}", 0.000000001);
// s1 == "1e-9"
auto s2 = fmt::format("{}", 0.1);
// s2 == "0.1"

免责声明:我是{fmt}的作者。

关于c++ - boost 格式设置浮点的最大精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233272/

相关文章:

c++ - boost::format 仅在 Windows 下异常

Mac OSX 上的 C++ std::getline 大小限制

c++ - 在从 Boost 派生的类派生的类中自动禁止复制是不可复制的吗?

c++ - 我可以为 Boost.Spirit.Qi 中的内存分配给列表运算符 (%) 提示吗?

c++ - 使用 gil 读取 png 图像

c++ - 为什么 Boost Format 和 printf 在相同的格式字符串上表现不同

c++ - 阻止以编程方式运行的系统命令的标准错误输出

c# - 有哪些 VC# 无法做到而 VC++(原生)可以做到的事情?

c++ - opencv错误乘以2 Mat的

c++ - 是否可以将 Boost.Format 与预分配缓冲区一起使用?