Dany (28.09.2011 15:00, просмотров: 176) ответил fk0 на Чушь! 9.995 * 100.0 = 999.5 И простое округление, а не в большую сторону, должно дать 1000. С какого это должно получиться 999? Вы таки хотите floor(), т.е. без округления? Ну тогда зачем же жаловаться, что 4.45*100.0 = 444.999[9] и, в
Начальная реализация, с которой все началось
const WORD Dec[]={1, 10, 100, 1000, 10000};
/*================================================================
Преобразование float заданной точности в строку ASCII
==================================================================
------------------------------------------------------------------
Входные параметры:
float val - значение для преобразования
BYTE intNumDig - кол-во знаков целой части(незначащие нули)
BYTE fractNumDig - кол-во знаков дробной
char *str - буфер для возврата
------------------------------------------------------------------
------------------------------------------------------------------
Возвращаемое значение:
BYTE strResLen - длина строки
------------------------------------------------------------------
------------------------------------------------------------------
Примечание: нет
------------------------------------------------------------------
==================================================================*/
BYTE FloatToASCII(float val, BYTE intNumDig, BYTE fractNumDig, char *str)
{
BYTE cnt;
BYTE strResLen;
WORD integer;
WORD fractional;
DWORD floatMulDec;
strResLen = 0;
// Если отрицательное значение
if(val < 0)
{
*str++ = '-';
strResLen++;
val = -val;
}
// Выделение целой части
integer = (WORD)val;
// Если не задано кол-во цифр в целой части
if(!intNumDig)
{
// Считаем по факту
for(cnt = 0; cnt < sizeof(Dec)/sizeof(Dec[0]); cnt++)
{
if((integer / Dec[cnt]) == 0)
{
intNumDig = cnt;
break;
}
}
if(!cnt)
intNumDig = 1;
}
Word2S(str, integer, intNumDig);
strResLen += intNumDig;
// Если есть дробная часть
if(fractNumDig)
{
str += intNumDig;
*str++ = '.';
strResLen++;
// Выделение дробной части
floatMulDec = val * Dec[fractNumDig];
fractional = floatMulDec % Dec[fractNumDig];
Word2S(str, fractional, fractNumDig);
strResLen += fractNumDig;
}
return strResLen;
}
...
flVal = 4.45;
FloatToASCII(flVal, 0, 2, buf) // buf = 4.44;
После этого стало понятно, что нужно округлять в большую сторону. Но при этом
flVal = 9.998;
FloatToASCII(flVal, 0, 2, buf) // buf = 9.00;
при выделении целой части записывается 9, а дробная часть 0.998 - округлялась
floatMulDec = val * Dec[fractNumDig]; // 0.998 * 100 = 100 с округлением в большую сторону
fractional = floatMulDec % Dec[fractNumDig]; // 0
Результат 9.0
Для этих случаев вводятся дополнительные проверки в ф-цию FloatToASCII, думал обойтись без них