主要思想是把原来的double数据扩大到精度位数的值,然后加上0.5,得到四舍五入的数据,、最后再缩小回按精度位处理的数据。
代码实现如下:
double Abs(double dVal)
{
//可用math.h中的fabs(double)替代;
return (dVal < 0 ? (0 - dVal) : dVal);
}
double Power(int iBase, int iPower)
{
//可用math.h中的pow(double, double)替代;
double dRet = 1.0;
for (int i = 0; i < iPower; ++i)
{
dRet *= iBase;
}
return dRet;
}
double DealDoublePrecision(double dVal, int iPrecision)
{
double dTmpVal = Abs(dVal);
dTmpVal = (__int64)(dTmpVal * Power(10, iPrecision) + 0.5) / Power(10, iPrecision);
dTmpVal = (dVal < 0) ? (0 - dTmpVal) : dTmpVal;
return dTmpVal;
}
调用时:
double dVal = 12.890765006;
dVal = test.DoublePrecisionDeal(dVal, 4);
精度为4时输出12.8908;
精度为2时输出12.89;
精度为5时输出12.89077;
输入值为-12.356041,精度为2时,输出为-12.36。
还有一种方法,用sprintf和sscanf实现
double DoubleRound(double dValue, unsigned int nPrecision)
{
char szValue[20] = {0};
double dRetVal = 0.0;
sprintf(szValue, "%.*lf", nPrecision, dValue);
sscanf(szValue, "%lf", &dRetVal);
return dRetVal;
}
还有一种是用输入输出流的方式:
#include <iostream>
#include <sstream>
#include <iomanip>
double DoubleRoundFunction(double dVal, int iPrecision)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(iPrecision) << dVal;
ss >> dVal;
return dVal;
}