我想在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()
来实现这个目标?
到目前为止,我能想到的唯一解决方案是将value
与floor(value)
进行比较:
std::stringstream s;
if (floor(value) == value)
s << std::setprecision(1) << std::fixed << value;
else
s << std::setprecision(10) << value;
如果必须,我会保留这个解决方案,但是我很好奇我是否会忽略一些可以帮助我避免条件的iostream小工具。
答案 0 :(得分:1)
使用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;