我想知道如何在c ++中将例如10打印为10.0000,或将10.1打印为10.1000。 我希望总位数相同,并使用' 0'右边的空白区域。 我读到了' setprecision',但它没有添加' 0'。 '固定'是浮点后的位数,我希望修改总位数。 有没有办法做到这一点,而不是使用printf?
答案 0 :(得分:0)
你可以做这样的事情:(考虑到你想要一个固定的长度为5)
int precision(double num){
int p;
if (num <1)
p = 5;
else if (num <10)
p = 4;
else if (num <100)
p = 3;
else if (num <1000)
p = 2;
else if (num <10000)
p = 1;
else
p = 0;
return p;
}
int main(){
double num;
std::cin>>num;
std::cout <<std::fixed <<std::setprecision(precision(num)) << num <<std::endl;
return 0;
}
根据您的要求,如果 After decimal的位数大于5,则会被截断。
现在,如果在小数点之前的位数超过5位数,则为您想要做的事情实现自己的逻辑。)
答案 1 :(得分:0)
您最终需要找出双倍数字的长度。我并不完全确定如何以安全的方式解决这个问题,但幸运的是,我可以向您展示一个我们可以用整数来做这个的例子。
基本上我建议创建一个新的facet类来实现do_put()
中的自定义格式。然后将这个课程灌输到你的流中。下面的完全相同的事情可以用于do_put()
的重载,它将double
作为其最后一个参数,并对for循环进行一些更改。
#include <iostream>
#include <iomanip>
class num_put : public std::num_put<char>
{
iter_type do_put( iter_type out, std::ios_base& str, char, long v ) const
{
std::streamsize width = str.width();
int digits = num_digits(v);
if (digits > width)
for (std::streamsize i(0); i < digits - width; ++i)
v /= 10;
/* v = static_cast<int>(v * 10) / 10.; // use this instead for
*/ // floating-point
str.flags(std::ios_base::left);
out = std::num_put<char>::do_put(out, str, '0', v);
str.width(width);
return out;
}
private:
template<class T>
static int num_digits(T num) // only works for integral types
{
int length = 1;
while (num /= 10)
++length;
return length;
}
};
int main()
{
std::cout.imbue(std::locale(std::cout.getloc(), new num_put));
std::cout << std::setw(5) << 123; // 12300
std::cout << std::setw(5) << 123456789; // 12345
}