| imho.ws |
![]() |
|
|
|
# 1 |
|
Newbie
Регистрация: 13.04.2003
Сообщения: 37
![]() |
Вот кусочек кода:
. . . int devider=10; int ascii_of_current_symbol; float converted_symbol; int int_part; float float_part; int container; current_symbol=(TCHAR)m_strName.GetAt(some_position); ascii_of_current_symbol=__toascii(current_symbol); . . . converted_symbol=(float)ascii_of_current_symbol/devider; int_part=converted_symbol; float_part=(converted_symbol-int_part)*devider; container=(int)float_part; container=container^some_position+2; . . . Проблема в этой строке: container=(int)float_part; Например (по шагам): current_symbol='w' ascii_of_current_symbol=119 converted_symbol=11.9000 int_part=11 float_part=9.0000 container=8 . . . Какого рожна 9.0000 преобразуется в 8 ???!!! Помогите пожалуйста! Заранее благодарен. |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 27.12.2002
Адрес: Belarus
Сообщения: 129
![]() |
Это нормально. Есть две причины:
1) При выводе float округляется, а при преобразовании в int происходит отсечение дробной части. Так 8.99995 при выводе только 4-х знаков после запятой напечатается как 9.0000, а при отсечении дробной части получится 8. 2) C/С++ работает с памятью без особой осторожности и при преобразовании в int просто берёт что содержится на месте float. Только при этом вместо 8 должна быть полная ересь (числа с плавающей запятой представляются весьма хитро). Выход => Незнаю, но вроде должна быть процедура по преобразованию float в int, её нужно слегка дополнить, что-то типа float2int(float_number + 0.5) -- однозначного отображения вещественных чисел на целые нет, но хотябы погрешность будет не более 0.5 (хотя возможны артефакты, так как с точки зрения вещественных чисел 0.5 может и не быть, а есть 0.4999999999 или 0.500000001
|
|
|
|
|
# 5 |
|
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
to Tano
самое простое, что приходит в голову. ты считываешь данные, скажем, из файла: Код:
...
ifstream f("somefile.txt");
#define MAXNUMCHAR 25
char numBuf[MAXNUMCHAR]; // максимум 24 символа в числе + 1 на '\0'
int realReadByte;
while (!f.eof())
{
f.get(numBuf, 24);
realReadByte = f.tellg();
numBuf[realReadByte] = '\0';
// а дальше, если число целое используешь
cout << endl << atoi(numBuf); // atoi(char *) переводит строку символов в число
// если число дробное
cout << endl << atof(numBuf);
}
f.close();
...
функций, переводящих строку в число бульше, чем я написал, остальное можно посмотреть в справке.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
|
|
|
|
# 7 |
|
Junior Member
Регистрация: 21.04.2005
Сообщения: 117
![]() |
Насколько я помню, округление при преобразовании float->int всегда в меньшую сторону. Если не жалко времени (не своего, а затрачиваемого на выполнение проги), то или юзай floor()/ceil(), или используй вариант г-на aleh, то есть просто int(float_part+0.5), должно работать по идее.
|
|
|
|
|
# 10 | ||
|
Junior Member
Регистрация: 13.05.2004
Сообщения: 128
![]() ![]() |
Цитата:
Цитата:
Последний раз редактировалось Crazy_kettle; 05.06.2006 в 22:42. |
||
|
|
|
|
# 11 | |
|
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
![]() (int)(f_num+0.5) - вот тебе и округление к ближайшему целому
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
|
|
|
|
# 12 | |
|
Advanced Member
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King |
|
|
|
|
|
# 13 |
|
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
не спорю
![]() я просто имел в виду, что она настолько элементарно пишется, что из-за этого ее и не стали вносить в библиотеку - типа кому надо, сам напишет
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
|