首页 > 解决方案 > 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 或其他)。

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

标签: c++boostboost-format

解决方案


我认为f格式说明符不可能,因为后者总是产生尾随零。但是,您可以使用g17 的说明符和精度,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} 的作者。


推荐阅读