预备知识: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;