在 C++ 中打印至少一位小数?

print at least one decimal place in c++?

我想在 C++ 中将 double 值字符串化,最多保留 10 位小数,所以我使用类似

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

但是,如果 value 有一些精确的整数值,例如 4.0,我希望它打印 4.0 而不仅仅是 4。有什么方法可以用 C++ stringstream 甚至老派 snprintf() 来实现吗?

到目前为止,我能想到的唯一解决方案是将 valuefloor(value) 进行比较:

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

如果需要,我会保留该解决方案,但我很好奇我是否忽略了一些可以帮助我避免条件的 iostream 小工具。

使用std::fixed:

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

Live Demo


更新:我想我看错了你要找的东西。 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;