更改浮点型数据显示小数位数的方法

因工作需要,需要将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;
}

在这里插入图片描述
可实现自定义精度的数据转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值