如何在C ++中编写良好的round_double函数?

问题描述

| 我正在尝试编写良好的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 (将#修改为@)