Спасибо за Ваши рекомендации и замечания. Но, всеже, с посторонней помощью была Нами написана функция округления double до заданной точностью. Ошибок в этой функции не обнаружено. Очень хотелось бы знать, как Вы считаете, возможно ли пользоваться этой функцией, или нет, и почему? Повторюсь, функция РАБОТЕТ КОРРЕКТНО. ОШИБОК Я НЕ ЗАМЕЧАЛ.
Спасибо за ваши комментарии.
С уважением, Александр.Ниже приводится сама функция.
#include "StdAfx.h"
#include "okryglenie.h"
#ifndef MATH
#define MATH
#include "math.h"
#endif
#define MAX_NUM_DOUBLE_DIGITS 7
#define MIN_DIGIT 1.e-11
Okryglenie::Okryglenie()
{
}
Okryglenie::~Okryglenie()
{
}
void Okryglenie::Okryglit(
double& DblNum, // Число, которое необходимо округлить
int NumDigits // Количество знаков после запятой, цифры после которых необходимо округлить
)
{
try
{
// Если округляемое число меньше заданного количества знаков после запятой, возвращаем 0.0
if(fabs(DblNum) < MIN_DIGIT)
{
DblNum=0.0f;
throw exExit();
}
// Если задали количество знаков бОльшее предельно допустимого, возвращаем double без изменений
if(NumDigits > MAX_NUM_DOUBLE_DIGITS)
throw exExit();
//return DblNum;
int Order = 0; // Порядок десятичного числа
double Quotient, DblNumE6;
long int NearestInt64; // Эту строку в 7-м вижуал си поменять на "INT64 NearestInt64"
Quotient = DblNum;
// Если число находится в пределах от 0.1 до 1.0 или равно 0.1 или 1.0, тогда это число
// нулевого порядка. Order остается равным нулю.
if(fabs(DblNum) < 0.1)
{
Quotient *= 10.;
Order--;
while(fabs(Quotient) < 0.1)
{
Quotient *= 10.;
Order--;
}
}
else if(fabs(DblNum) > 1.)
{
Quotient /= 10.;
Order++;
while(fabs(Quotient) > 1.)
{
Quotient /= 10.;
Order++;
}
}
DblNumE6 = Quotient * pow(10., (double)NumDigits); // Quotient * (10.**NumDigids)
int Sign = 1;
if(DblNum < 0.0)
Sign = -1;
NearestInt64 = (long int)(DblNumE6 + Sign * 0.5); // В 7-м вижуал си поменять эту строку
// на "NearestInt64 = (INT64)(DblNumE6 + Sign * 0.5);"
Quotient = NearestInt64 / pow(10., (double)NumDigits); // NearestInt / (10.**NumDigids)
DblNum = Quotient;
if( Order <= -1*NumDigits )
{
DblNum = 0.0f;
throw exExit();
//return DblRound;
}
if( Order > 0 )
{
while(Order > 0)
{
Quotient = Quotient * 10.;
Order--;
}
DblNum = Quotient;
}
else if( Order < 0 )
{
while(Order < 0)
{
Quotient = Quotient / 10.;
Order++;
}
DblNum = Quotient;
}
}
catch (Okryglenie::exExit)
{
}
//return DblRound;
}