Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Float  (Прочитано 16385 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Aleexeey
Постоялец

ru
Offline Offline

« : 06-12-2008 09:10 » 

Здравствуйте форумчане!

Что-то нелепое на меня нашло, может и тупой вопрос,
как число (например float f = 21.43f;) преобразовать в (int i1 = 21; int i2 = 43;)
т. е. отделить целую часть от дробной.  Здесь была моя ладья...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-12-2008 10:01 » 

Код:

//считается, что f - положительное
float f = 21.43;

//целая часть
int i1 = f;

float f2=f-i1;//тут только дробная часть от f

//дальше всё зависит от точности, которая тебе нужна
//умножаем f2 на 10, пока дробная часть не станет == 0

//тут будет дробная часть "в виде целого"
int i2=0;

for(;f2>=0.0000001;)//точность
{
  f2*=10;

  i2= i2*10+f2;

  f2=f2-(int)f2;
}

(не тестировал Улыбаюсь )
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #2 : 06-12-2008 10:07 » 

Спа-а-а-а-а-а...*1024...сибо!!!*1024!  Улыбаюсь Улыбаюсь то что нужно!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-12-2008 10:10 » 

для дробной части есть способ дольше, но проще - отформатировать строку, затем достать всё после точки :

(только я с CString покажу , чтоб с буфером не возюкаться Отлично )
Код:
CString txt;
txt.Format("%f",f-(int)f);

int i2=0;
const char* p=strchr(txt,'.');
if(p)
{
   i2=atoi(p+1);
}

ну и если чисто с CString :
Код:
CString txt;
txt.Format("%f",f-(int)f);
txt.MakeReverse();
txt=txt.SpanExcluding('.');
txt.MakeReverse();
int i2=atoi(txt);
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #4 : 06-12-2008 10:14 » 

да мне дробную часть округлить надо!  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-12-2008 10:16 » 

int i1 = (f+.5);

Улыбаюсь

или
... (int)(f+.5);
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #6 : 06-12-2008 10:24 » 

Не то хотел сказать.  Краснею
Код:
Float = 2.76;
result:
int1 = 2;
int2 = 8;
спасибо Алексей1153++ за помощь, теперь все нормально!!!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 06-12-2008 10:30 » 

тогда так:
f=((float)(int)(f*10+.5))/10;

или

txt.Format("%.1f",f);
« Последнее редактирование: 06-12-2008 10:34 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 06-12-2008 10:34 » 

ты бы вообще цель сказал, а то какой вопрос - такой ответ )
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #9 : 06-12-2008 10:43 » 

Алексей1153++ мне твой пример

int i1 = (f+.5);

Улыбаюсь

или
... (int)(f+.5);

подошел, и работает без проблем, спасибо!

Вот что получилось:

Код:
float figure = 234.543;
int num1 = figure;
float p = figure - num1;
p *= 10;
int num2 = (int)(p+.5);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 06-12-2008 10:45 » 

вместо

float p = figure - num1;
p *= 10;
int num2 = (int)(p+.5);

сразу
int num2 = (figure - num1)*10+.5;
Улыбаюсь
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #11 : 06-12-2008 10:51 » 

Да, можно и так (что то не догадался)  Улыбаюсь

А если округление числа с плавающей точкой так просты, то для чего в
#include <math.h>
есть такие функции как:
floorf, floor, ceil, ceilf... а?  Быть такого не может
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 06-12-2008 10:54 » 

ну раз есть - пользуйся ими, конечно, я просто не задумывался об этом и не применял никогда. Вообще, с округлением раз в год встречаться приходится )) А в строку распечатать удобнее форматированием
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #13 : 06-12-2008 11:01 » 

Вообще, с округлением раз в год встречаться приходится ))

Ух ты, а я только сейчас столкнулся с округлением числа с плавающей точкой!  Отлично
Поди больше 5, а то и 6 лет прошло.  Жжешь  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 06-12-2008 11:07 » 

ура, я чаще Улыбаюсь)
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #15 : 06-12-2008 11:10 » new

во почему ты знал решение  Ага а я нет  С ума сойти...
нишо поравнялись  Что, съел?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines