ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
275237 Топик полностью
Dany (28.09.2011 15:00, просмотров: 143) ответил 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, думал обойтись без них