我正在尝试优化以下内容。下面的代码执行此操作:
如果 a = 0.775 并且我需要精度 2 dp 那么 a => 0.78
基本上,如果最后一位是 5,则向上舍入下一位,否则不向上舍入。
我的问题是 0.45 不会四舍五入到 0.5 小数点后 1,因为该值保存为 0.44999999343.... 并且 setprecision 将其四舍五入为 0.4。
这就是为什么 setprecision 被迫更高setprecision(p+10)
,然后如果它真的以 5 结尾,添加少量以便正确四舍五入。
完成后,它将 a 与字符串 b 进行比较并返回结果。问题是,这个函数被调用了几十亿次,让程序变得很糟糕。关于如何重写/优化它以及代码中的哪些功能在机器上如此繁重的任何更好的想法?
bool match(double a,string b,int p) { //p = precision no greater than 7dp
double t[] = {0.2, 0.02, 0.002, 0.0002, 0.00002, 0.000002, 0.0000002, 0.00000002};
stringstream buff;
string temp;
buff << setprecision(p+10) << setiosflags(ios_base::fixed) << a; // 10 decimal precision
buff >> temp;
if(temp[temp.size()-10] == '5') a += t[p]; // help to round upwards
ostringstream test;
test << setprecision(p) << setiosflags(ios_base::fixed) << a;
temp = test.str();
if(b.compare(temp) == 0) return true;
return false;
}