У меня проблемы с выполнением того, что я считаю довольно простой задачей на C ++.Я пытаюсь вывести значение с плавающей запятой для записи в файл журнала.Файл журнала содержит 7 символов, предназначенных для вывода числа, но я считаю, что будет немного нетривиально получить постоянный вывод из 7 символов в широком диапазоне значений различных величин, знаков и точностью (например, 1, -0,60937, 0,60937, 0,009371, -0,009371).У меня есть какой-то взломанный способ сделать это:
int desiredPrecision = 6;
if (runningAvg < 0)
desiredPrecision--;
if (std::abs((long) runningAvg) < 1)
desiredPrecision--;
else
theFile << std::showpoint;
theFile.precision (desiredPrecision);
theFile.fill('0');
theFile.setf(std::ios_base::left, std::ios_base::adjustfield);
theFile.width(7);
theFile << runningAvg << std::endl;
Но этот способ кажется мне чрезвычайно хакерским.Он работает с числами, такими как: -0,6037 (выходные данные: -0,6094)
-1,7 (-1,7000)
-1 (-1,0000)
0,6937 (0,60937)
0,00937 (0,00937)
, но он разрывается с 0,009371 (0,009371)
и
-0,009371 (-0,009371)
Теперь яМожно добавить еще один уровень операторов if-else для работы с числами с малой величиной, но это, кажется, только добавляет к уровню хакерства, а не является чистым способом сделать это.Я немного поиграл с fprintf, но, похоже, его больше интересует строгое математическое определение точности, тогда как в этом приложении я больше беспокоюсь об ограничении ширины поля до 7 символов.(Я также могу рассчитывать на то, что эти числа никогда не будут такими большими, что я переполню 6 символов плюс знак)
Я что-то упускаю здесь очевидное?У кого-нибудь есть советы по менее взломанному способу достижения этого?