我基本上有以下内容:
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等)。
我认为这是很明显的事情,我花了两次仔细阅读文档才能发现它不是默认值(在某些地方暗示),但是我找不到方法去做。
答案 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}的作者。