我基本上有以下内容:
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/