Boost формат установить максимальную точность с плавающей запятой - PullRequest
1 голос
/ 19 марта 2019

По сути, у меня есть следующее:

typedef TFp double;
boost::format fmt("Floating point: %2$f");
TFp v = 0.000000001;
fmt % v;
std::cout << fmt.str();

Согласно руководству по формату повышения, по умолчанию выводится 6 цифр точности, поэтому отображается 0,000000, что мои пользователи интерпретируют как 0 (а я не могудаже обвинить их в этом).Я мог бы изменить строку формата и добавить точку, а затем число после знака доллара, чтобы зафиксировать количество цифр, но это число может варьироваться в зависимости от того, насколько велико значение в float, и из-за некоторых особенностей моего кода,typedef, который у меня есть в моем примере (для удвоения), иногда является плавающей точкой, так что тогда мне придется снова иметь другое число в строке формата.

По сути, я ищу способ сказатьрасширенный формат », дайте мне столько цифр, сколько необходимо, чтобы показать значение любого типа с плавающей запятой, но не более (т. е. когда значение равно 0,003, оно не должно печатать 0,003000 или что-либо еще).

Я быдумаю, что это очевидно, и мне понадобилось очень внимательно прочитать документацию, чтобы понять, что это не по умолчанию (как намекает в некоторых местах), но я не могу найти способ сделать это.

1 Ответ

1 голос
/ 20 марта 2019

Я не думаю, что это возможно с помощью спецификатора формата f, поскольку последний всегда выдает конечные нули.Тем не менее, вы можете использовать спецификатор g и точность 17 для double, которые уберут конечные нули и не потеряют точность (при условии IEE754 double).К сожалению, в некоторых случаях это приводит к нежелательному побочному эффекту, поскольку в некоторых случаях требуется больше цифр, чем необходимо, например, 0.1 будет отформатирован как 0.10000000000000001.

Если вы не ограничены Boost Format, то вы можете использовать форматированиесредство, которое дает вам кратчайшее десятичное представление.Например, библиотека {fmt} делает это по умолчанию:

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

Отказ от ответственности : я являюсь автором {fmt}.

...