boost格式设置浮点数的最大精度

时间:2019-03-19 03:38:06

标签: 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(我什至不能怪他们这么认为)。我可以修改格式字符串,并在美元符号后添加一个点,然后添加一个数字以固定数字位数,但是该数字可能会有所变化,具体取决于浮点数的大小,并且由于我的代码的某些特殊性,在我的示例中(加倍)的typedef有时是浮点数,因此我必须在格式字符串中再次输入一个不同的数字。

基本上,我正在寻找一种告诉升压格式的方法,即“给我尽可能多的数字以显示任何浮点类型的值,但不要更多”(即,当值为0.003时,不应打印0.003000等)。

我认为这是很明显的事情,我花了两次仔细阅读文档才能发现它不是默认值(在某些地方暗示),但是我找不到方法去做。

1 个答案:

答案 0 :(得分:1)

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