因工作需要,需要将float类型的数据通过字符串的方式进行展示。
在使用to_string()函数进行转换的过程中,出现了一点问题,因为精度丢失的问题,某些情况下数据的展示不正常,例如某个数据位-180,但是在通过to_string()进行转换之后,就变成了如下图所示的样子:
鉴于此,在查阅了相关的资料之后,将相关的解决方法展示如下。
方法一:使用"setprecision"+"字符流"的方式
在查阅资料的过程中,首先映入眼帘的是就是通过C++中的setprecision的方式修改显示的精度。
但是查阅到的内容,均是修改的cout的显示,并不能做到存储的方式。
后联想到以前使用过的字符流sstream,整理出了以下的内容:
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;
int main()
{
float f = 3.141592654;
cout << setprecision(3) << f << endl;
stringstream ss;
ss << setprecision(3) << f2;
float f2{ 0 };
ss >> f2;
cout << f2 << endl;
system("pause");
return 0;
}
由此可证,通过字符流的方式是可以实现本操作的。
方法二:格式化字符串
这种方法相较于上述方法更为简单,上代码:
#include <iostream>
using namespace std;
int main()
{
char buff[4]{ 0XFF, 0XFF, 0X33, 0XC3 };
float f = *(float*)buff;
cout << to_string(f) << endl;
char result[64]{ 0 };
sprintf_s(result, "%0.2f", f);
cout << result << endl;
system("pause");
return 0;
}
方法三:自定义函数的方式
以下函数实现了float类型的任意小数位数的保留,同时实现了四舍五入,基本思路是通过加上一个常量,然后通过两次类型转换,实现对于非期望数据的丢弃。
#include <iostream>
using namespace std;
float precisionFloatData(float rawData, int precis)
{
if (precis < 0)
{
return rawData;
}
if (0 == precis)
{
return round(rawData);
}
int iData = static_cast<int>((rawData + 0.5 * pow(0.1, precis)) * pow(10, precis));
return static_cast<float>(iData / pow(10, precis));
}
int main()
{
float f = 3.141592654;
cout << precisionFloatData(f, 0) << endl;
cout << precisionFloatData(f, 1) << endl;
cout << precisionFloatData(f, 2) << endl;
cout << precisionFloatData(f, 3) << endl;
cout << precisionFloatData(f, 4) << endl;
system("pause");
return 0;
}
可实现自定义精度的数据转换。