问题描述
|
我正在尝试编写良好的round_double函数,它将以指定的精度四舍五入:
1。
double round_double(double num,int prec)
{
for (int i = 0; i < abs(prec); ++i)
if(prec > 0)
num *= 10.0;
else
num /= 10.0;
double result = (long long)floor(num + 0.5);
for (int i = 0; i < abs(prec); ++i)
if(prec > 0)
result /= 10.0;
else
result *= 10.0;
return result;
}
2。
double round_double(double num,int prec)
{
double tmp = pow(10.0,prec);
double result = (long long)floor(num * tmp + 0.5);
result /= tmp;
return result;
}
此功能无法完成我想做的事,但我认为它们还不够好。因为从精度= 13-14开始,它们将返回不良结果。
我确定可以写出更好的double_round的原因是,仅以指定的精度(例如18)通过cout
打印数字,比我的函数结果打印的结果更好。
例如这部分代码:
int prec = 18;
double num = 10.123456789987654321;
cout << setiosflags(ios::showpoint | ios::fixed)
<< setprecision(prec) << \"round_double(\" << num << \",\"
<< prec << \") = \" << round_double(num,prec) << endl;
第一个first5ѭ打印round_double(10.123456789987655000,18) = -9.223372036854776500
,第二个second4打印。
如何在C ++中编写良好的round_double函数?还是已经存在?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)