вывести хотя бы один десятичный знак в 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 ответ:
Использование
std::fixed
:s << "value is " << std::fixed << std::setprecision(10) << value;
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;