Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.65
Noname2512
4 / 4 / 1
Регистрация: 25.06.2010
Сообщений: 106
#1

непонятки - C++

02.08.2011, 13:40. Просмотров 4662. Ответов 81

у меня есть прога которая берет дабл и разделяет его на две сост. целое и дробное
C++
1
2
this->z = int(d);
this->p = ( d - int(d) )*100+0.5;
объясните почему без "+0.5" ничего не работает для чисел чья дробная часть( нечетная и меньше равна 9 )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 13:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос непонятки (C++):

непонятки с for - C++
Издавна мучает вопрос почему некоторые используют в цикле for ( int i = n; i < m ; i++), а другая часть населения for ( int i = n; i < m ;...

Непонятки с bind2nd - C++
Привет. Вот к примеру есть такой код: #include <algorithm> #include <functional> #include <iostream> #include <array> ...

Непонятки с классами - C++
Народ, уже всё перерыл, впервые с проблемой столкнулся :( Создаю консольное приложение: файл class.h #pragma once class Order{ ...

Непонятки с итераторами - C++
Здравствуйте, господа программисты. Пытался написать вот эту задачку, но получается что-то нехорошее. Помогите, пожалуйста! #include...

Непонятки со scanf - C++
char str_check; //строка для функции "check", которая проверяет введенные данные { scanf("%s",&str_check); } выскакивает...

Непонятки с wchar_t - C++
Прошу помощи: что-то не так с wchar_t. Не копирует имена файлов. Содержание program_config.txt config.cfg C:\\Projects\\abx.txt...

81
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2011, 17:05 #16
Лучший вариант это как сказал OstapBender - modf.
Или такой:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    double  a = 1.2;
 
    int a_i;
    double  a_f;
 
    a_i = floor( a );
    a_f = a - a_i;
 
    printf( "a = %f\na_i = %d\na_f = %f\n", a, a_i, a_f );
 
    return 0;
}
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.08.2011, 17:09 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если нужно принципиально по другому без использования функции int
Дело не в этом. Просто задача состоит в том, чтобы представить дробное число, в котором всего 2 цифры после точки, в виде двух целых: например рубли и копейки. Вот без округления может возникать ошибка в одну копейку.
Правда в финансовых программах, насколько знаю, вообще стараются обходиться без чисел с плавающей точкой.

Добавлено через 41 секунду
Цитата Сообщение от lazybiz Посмотреть сообщение
Лучший вариант это как сказал OstapBender - modf.
Это не избавит от проблемы перевода в целое
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:16 #18
А чем код lazybiz плох?
ТС о функциях ceil и floor можно сдесь прочесть
http://www.cplusplus.com/reference/c...y/cmath/floor/
о modf здесь
http://www.cplusplus.com/reference/clibrary/cmath/modf/
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2011, 17:17 #19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Это не избавит от проблемы перевода в целое
А зачем переводить и какая такая проблема? Нужна целая и дробная части? Пожалуйста!)
Или я суть темы не уловил?...
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.08.2011, 17:20 #20
Цитата Сообщение от lazybiz Посмотреть сообщение
А зачем переводить и какая такая проблема? Нужна целая и дробная части? Пожалуйста!)
Или я суть темы не уловил?...
Ещё раз, например нужно из суммы 123.45 выделить рубли и копейки. И то, и другое должно быть целыми числами

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А чем код lazybiz плох?
А чем код ТС плох? Он вполне себе работает (ну про ограничения разрядности ты и сам говорил)

Добавлено через 43 секунды
Цитата Сообщение от lazybiz Посмотреть сообщение
Или я суть темы не уловил?...
Вопрос был простой: зачем прибавлять 0.5
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2011, 17:24 #21
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ещё раз, например нужно из суммы 123.45 выделить рубли и копейки. И то, и другое должно быть целыми числами
Так в чем проблема?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    double  a = 1.2;
 
    int rubli, kopeyki;
    double  a_f;
 
    rubli = floor( a );
    a_f = a - rubli;
 
    kopeyki = ceil( a_f * 100 );
 
    printf( "rubli = %d\nkopeyki = %d\n", rubli, kopeyki );
 
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вопрос был простой: зачем прибавлять 0.5
А прибавлять 0.5 я так полагаю нужно для того чтобы округление происходило в большую сторону.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:24 #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ещё раз, например нужно из суммы 123.45 выделить рубли и копейки. И то, и другое должно быть целыми числами
Ни modf ни ceil этого не дадут - тогда чтобы перебрать все знаки после запятой нужно всё время умножать на 10, пока последняя цифра не станет нулём, а затем поделить обратно, поясню

0,2563 =
25630 = 0,2563*10^5 => всего после запятой 5-1 знака, а там уже что делать c дробной частью дело ТС

А если к рублям - то преобразовать к инт int(spart*100)
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.08.2011, 17:34 #23
Цитата Сообщение от lazybiz Посмотреть сообщение
Так в чем проблема?
В том, что твоя программа из 1.07 делает 1 руб 8 коп.

Цитата Сообщение от lazybiz Посмотреть сообщение
А прибавлять 0.5 я так полагаю нужно для того чтобы округление происходило в большую сторону.
К ближайшему целому

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А если к рублям - то преобразовать к инт int(spart*100)
К копейкам.
int(spart*100 + 0.5)

Не по теме:

Забавные вы, ребята

0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:36 #24
Вот за копейки, я взял код lazybiz чтобы исключить int()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream.h>
#include <math.h>
 
int main()
{
    char ch;
    double val;
 
    double fpart;
    double spart;
    do
    {
        cout<<"Enter double\r\n";
        cin>>val;
 
        fpart = floor(val);
        spart = val - fpart;
        cout<<fpart<<" RU "<<int(spart*100)<<" KOP\r\n";
 
        cout<<"Celay chast'"<<fpart<<"\r\n";
        cout<<"Drobn chast'"<<spart<<"\r\n";
 
        cout<<"[Y/N] - Y - Enter new value\r\n";
        cin>>ch;
    }
    while(ch == 'Y' || ch == 'y');
    return 0;
}
Вот работа
Enter double
123.43
123 RU 43 KOP
Celay chast'123
Drobn chast'0.43
[Y/N] - Y - Enter new value


Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
К копейкам.
int(spart*100 + 0.5)
ну может хватит, смотри пост выше!Lazybiz, юзать ceil это уже лишнее
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2011, 17:37 #25
Цитата Сообщение от grizlik78 Посмотреть сообщение
В том, что твоя программа из 1.07 делает 1 руб 8 коп.
Замени ceil на floor в последнем случае тогда округление будет происходить в меньшую сторону.
А вообще мне кажется что ты уже придираешься.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Lazybiz, юзать ceil это уже лишнее
Ну почему же, вовсе нет. Это смотря какой результат ты ожидаешь увидеть.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:40 #26
Цитата Сообщение от lazybiz Посмотреть сообщение
Замени ceil на floor в последнем случае тогда округление будет происходить в меньшую сторону.
А вообще мне кажется что ты уже придираешься.
Согласен на 100%!
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.08.2011, 17:41 #27
Цитата Сообщение от lazybiz Посмотреть сообщение
Замени ceil на floor в последнем случае тогда округление будет происходить в меньшую сторону.
Тогда ошибка будет в других числах.

Цитата Сообщение от lazybiz Посмотреть сообщение
А вообще мне кажется что ты уже придираешься.
Фигассе. Да бухгалтеры за копейку убьют!

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот работа
Ага. И вот тоже работа (твоей программы):
Enter double
1.12
1 RU 12 KOP
Celay chast'1
Drobn chast'0.12
[Y/N] - Y - Enter new value
y
Enter double
1.13
1 RU 12 KOP
Celay chast'1
Drobn chast'0.13
[Y/N] - Y - Enter new value
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:43 #28
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.08.2011, 17:46 #29
Вы конечно и дальше можете не замечать проблему в вашем коде, это ваше дело.
Но повторю ещё раз. Код в исходном посте вполне рабочий и решает поставленную задачу. Вопрос был только в том, почему он такой. Ответ я давно дал и ТС, насколько я понимаю, его понял. А я пока помолчу.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.08.2011, 17:54 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
Фигассе. Да бухгалтеры за копейку убьют!
Да я не про копейку, а про способ реализации. Тут как ни пиши в любом случае в какую-то сторону нужно округлять.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 17:54
Привет! Вот еще темы с ответами:

Непонятки по ссылкам - C++
Доброго времени суток! Помогите, пожалуйста разобраться. Изучаю ссылки и мне кое-что не понятно. Допустим мы объявили функцию: ...

Непонятки с синтаксисом - C++
В заголовочном файле мне встретилось такое описание класса: class source_mcast_reciever { uint16_t m_port; ...

Непонятки со списком - C++
Нашёл код в интернете и немного не понимаю его в некоторых местах. Объясните мне пожалуйста, зачем в коде вот тут: ...

непонятки с указателями - C++
Добрый день! изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело... :( Есть структура - Point...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
02.08.2011, 17:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru