![]() |
Проблема при конвертация float->int !!!
Вот кусочек кода:
. . . 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 ???!!! Помогите пожалуйста! Заранее благодарен. |
Это нормально. Есть две причины:
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 :) |
Скажите, как при считывании инфы из файла в char'овский массим потом переконвертить его в int или double?
Спасибо |
Tano
ты считываешь каждый символ из файла в соответствующий элемент массива? Что ты теперь хочешь сделать? 1) из нескольких элементов массива составить число? 2) или каждый элемент массива перегнать в число? |
to Tano
самое простое, что приходит в голову. ты считываешь данные, скажем, из файла: Код:
...функций, переводящих строку в число бульше, чем я написал, остальное можно посмотреть в справке. |
Kvarx, элемент записываются в массив, например 1.1 и сразу переводится в double..в принципе GOre01 понятно объяснил - спасибо, я попробую уже сам.
|
Насколько я помню, округление при преобразовании float->int всегда в меньшую сторону. Если не жалко времени (не своего, а затрачиваемого на выполнение проги), то или юзай floor()/ceil(), или используй вариант г-на aleh, то есть просто int(float_part+0.5), должно работать по идее. :idontnow:
|
В данном случае, Имхо лучше использовать ф-цию round (округляет до БЛИЖАЕШЕГО целого)
|
До сих пор в Си/Си++ не было функции round. Похоже Crazy_kettle перепутал с каким-то другим языком программирования.
|
Цитата:
Цитата:
|
Цитата:
(int)(f_num+0.5) - вот тебе и округление к ближайшему целому :) |
Цитата:
|
не спорю :)
я просто имел в виду, что она настолько элементарно пишется, что из-за этого ее и не стали вносить в библиотеку - типа кому надо, сам напишет |
| Часовой пояс GMT +4, время: 15:50. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.