вывести хотя бы один десятичный знак в c++?


Я хочу stringify double значения в C++ с точностью до 10 знаков после запятой, поэтому я использую что-то вроде

std::stringstream s;
double value = 3.1415926;
s << "value is " << std::setprecision(10) << value;

Однако, если value имеет некоторое точное интегральное значение, такое как 4.0, я хочу, чтобы он напечатал 4.0, а не только 4. Есть ли какой-то способ сделать это с помощью C++ stringstream или даже олдскульной snprintf()?

Пока единственное решение, которое я могу придумать, это сравнить value с floor(value):

std::stringstream s;
if (floor(value) == value)
  s << std::setprecision(1) << std::fixed << value;
else
  s << std::setprecision(10) << value;

Я сохраню это решение, если придется, но мне любопытно, если я упускаю какой-то гаджет iostream, который мог бы помочь мне избежать условного.

1 2

1 ответ:

Использование std::fixed:

s << "value is " << std::fixed << std::setprecision(10) << value;

Live Demo


Update : я думаю, что неправильно понял, что вы ищете. std::fixed в одиночку не решить проблему, которую вы хотите решить-используя точность 1 для целых чисел и точность 10 для дробных чисел. Вы можете использовать std::modf() чтобы различать их (для простоты я буду игнорировать Infinite и NaN, но убедитесь, что вы учитываете их в своем фактическом коде), например:

#include <cmath>
std::stringstream s;
double integral;
if (std::modf(value, &integral) == 0)
    s << std::fixed << std::setprecision(1) << integral;
else
    s << std::fixed << std::setprecision(10) << value;