0

我有一个字符串:(66)

然后我将其转换为 double 并做一些数学运算:atof(t.c_str()) / 30

然后我将它转换回字符串:string s = boost::lexical_cast<string>(hizdegerd)

问题是当我在标签上显示它时,它变成了 2,20000001。

我什么都试过了。sprintf 等

我只想在点后显示一位数字。

hizdegerd = atof(t.c_str()) / 30;
char buffer [50];
hizdegerd=sprintf (buffer, "%2.2f",hizdegerd);
if(oncekideger != hizdegerd)
{

    txtOyunHiz->SetValue(hizdegerd);

    oncekideger = hizdegerd;
}
4

3 回答 3

1

我想我会将格式包装到一个函数模板中,如下所示:

#include <iostream>
#include <sstream>
#include <iomanip>

template <class T>
std::string fmt(T in, int width = 0, int prec = 0) {
    std::ostringstream s;
    s << std::setw(width) << std::setprecision(prec) << in;
    return s.str();
}

int main(){
    std::string s = fmt(66.0 / 30.0, 2, 2);
    std::cout << s << "\n";
}
于 2013-07-05T12:31:14.367 回答
0

您可以使用这种转换回的方式string,然后只考虑所需的精度位数:

ostringstream a;
a.precision(x); // the number of precision digits will be x-1
double b = 1.45612356;
a << b;
std::string s = a.str();
于 2013-07-05T12:27:28.947 回答
0

既然你写了“我想展示”:

#include<iostream>
#include<iomanip>

int main()
{
    std::cout << std::fixed << std::setprecision(1) << 34.2356457;
}

输出:

34.2

顺便说一句, sprintf 是缓冲区溢出易受攻击的,而不是 C++ 。

于 2013-07-05T12:50:52.063 回答