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

print at least one decimal place in c++?

本文关键字:一个 小数 C++ 打印      更新时间:2023-10-16

我想用最多 10 位小数C++double值字符串化,所以我使用类似的东西

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;

现场演示


更新:我想我误读了你要找的东西。 仅靠std::fixed并不能解决您要解决的问题 - 对整数使用精度 1,对小数使用精度 10。 您可以使用std::modf()来区分它们(为简单起见,我将忽略无限和 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;