C++浮点数保留n位小数的近似方法、字符串转数字

预备知识:C++中,浮点数的精确度有限。float精度是2^23,能保证6位。
double精度是2^52,能保证15位。参考:C/C++中float,double到底保留几位有效数字
我也没有特别研究浮点数的存储方法,以下是浮点数位数较小时能够用的方法,具体精确到小数哪一位、是什么精确法,暂时没有仔细研究。

/*
自己封装的将浮点数保留n位小数的方法,返回的是保留n位小数后的数字对应的字符串
*/
#include <regex>
string reserveNDicimals(double number, int n) {
	smatch matchRes;
	regex matchPattern("^\\d{1,}.\\d{" + to_string(n) + "}");
	string ans_str = "";

	double addition = 0.5;
	for (int i = 0; i < n; i++) {
		addition *= 0.1;
	}
	number += addition;
	string temp__str = to_string(number);
	string::const_iterator iter_start = temp__str.begin();
	string::const_iterator iter_end = temp__str.end();
	regex_search(iter_start, iter_end, matchRes, matchPattern);
	ans_str = matchRes[0];

	return ans_str;
}

另外利用现成的相关方法将浮点数保留指定位数小数,然后以字符串形式保存

stringstream ss;
//将浮点数1.2356保留两个小数,且左起第3位小数大于等于5时进1
ss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << 1.2356;
cout << ss.str() << endl;//将输出"1.24"

以下是在网上找到的几个将浮点数保留n位小数的方法,试过了,在浮点数位数很多时不准确,但在位数不多时可用。

//方法1
//此方法返回的前bits位小数就是四舍五入后的保留参数number的bits位小数时结果
double round3(double number, int bits) {
	for (int i = 0; i < bits; ++i) {
		number *= 10;
	}
	number = (long long)(number + 0.5);
	for (int i = 0; i < bits; ++i) {
		number /= 10;
	}
	return number;
}

//方法2
//使用前要自己下载相关源码,下载地址:https://boostorg.jfrog.io/artifactory/main/release/
double value;
try
{
    value = boost::lexical_cast<double>(my_string);
}
catch (boost::bad_lexical_cast const&)
{
    value = 0;
}

//方法3
#include <stdlib.h>
double strict_str2double(char const* str)
{
	char* endptr;
	double value = strtod(str, &endptr);
	if (*endptr) return 0;
	return value;
}

字符串转成数字

string str="12345";
stringstream intString(str);
long long price;

//此时price中保留着字符串"12345"对应的数字。此时我也想将price声明为double类型,但是此时直接以浮点数cout输出时只保留了一位小数,而to_string(price)后cout输出时保留了6位小数。。。没弄明白
intString >> price;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值