Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/37: Рейтинг темы: голосов - 37, средняя оценка - 4.84
4 / 4 / 0
Регистрация: 25.06.2010
Сообщений: 106

непонятки

02.08.2011, 13:40. Показов 8690. Ответов 81

Студворк — интернет-сервис помощи студентам
у меня есть прога которая берет дабл и разделяет его на две сост. целое и дробное
C++
1
2
this->z = int(d);
this->p = ( d - int(d) )*100+0.5;
объясните почему без "+0.5" ничего не работает для чисел чья дробная часть( нечетная и меньше равна 9 )?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2011, 13:40
Ответы с готовыми решениями:

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

непонятки с Си
вобщем вот что задали Вот что я зделал при выполнении пишет s=none(или nane-как то так)/почему так?где ошибка? у кого то так же...

Непонятки с WXDev C++
Народ, у кого данный компилятор, помогите разобраться. Вот программа: #include <iostream.h> #include <conio.h> void...

81
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.08.2011, 17:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 17:24
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ещё раз, например нужно из суммы 123.45 выделить рубли и копейки. И то, и другое должно быть целыми числами
Ни modf ни ceil этого не дадут - тогда чтобы перебрать все знаки после запятой нужно всё время умножать на 10, пока последняя цифра не станет нулём, а затем поделить обратно, поясню

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

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

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

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

Не по теме:

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

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 17:36
Вот за копейки, я взял код 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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.08.2011, 17:37
Цитата Сообщение от grizlik78 Посмотреть сообщение
В том, что твоя программа из 1.07 делает 1 руб 8 коп.
Замени ceil на floor в последнем случае тогда округление будет происходить в меньшую сторону.
А вообще мне кажется что ты уже придираешься.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Lazybiz, юзать ceil это уже лишнее
Ну почему же, вовсе нет. Это смотря какой результат ты ожидаешь увидеть.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 17:40
Цитата Сообщение от lazybiz Посмотреть сообщение
Замени ceil на floor в последнем случае тогда округление будет происходить в меньшую сторону.
А вообще мне кажется что ты уже придираешься.
Согласен на 100%!
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.08.2011, 17:41
Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 17:43
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.08.2011, 17:46
Вы конечно и дальше можете не замечать проблему в вашем коде, это ваше дело.
Но повторю ещё раз. Код в исходном посте вполне рабочий и решает поставленную задачу. Вопрос был только в том, почему он такой. Ответ я давно дал и ТС, насколько я понимаю, его понял. А я пока помолчу.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.08.2011, 17:54
Цитата Сообщение от grizlik78 Посмотреть сообщение
Фигассе. Да бухгалтеры за копейку убьют!
Да я не про копейку, а про способ реализации. Тут как ни пиши в любом случае в какую-то сторону нужно округлять.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.08.2011, 18:00
Цитата Сообщение от lazybiz Посмотреть сообщение
Тут как ни пиши в любом случае в какую-то сторону нужно округлять
Есть decimal в с#, есть длинная арифметика. Обычно их в финансах используют...
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.08.2011, 18:13
В C99 есть функция round(), которая делает нужное округление. Но можно её и самостоятельно реализовать, например так:
C
1
2
3
4
5
6
double round(double x)
{
    if (x < 0)
        return ceil(x - 0.5);
    return floor(x + 0.5);
}
Добавлено через 1 минуту
Ну а про то, что в финансах double не используют я уже тоже говорил
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
02.08.2011, 19:02
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <math.h>
 
#define PRECISION 3 /* digits after point */
 
int main(void){
    double val;
    int fract;
    
    while ( printf("Value: ") && scanf("%lf", &val) == 1 ){
        fract = (int)((val - floor(val)) * pow(10.0, PRECISION) + 0.5);
        while ( fract && ! ( fract % 10 ) )
            fract /= 10;
        printf("Int part: %d Fract part: %d\n", (int)val, fract);
    }
    
    return 0;
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 22:02
Цитата Сообщение от grizlik78 Посмотреть сообщение
В C99 есть функция round(), которая делает нужное округление. Но можно её и самостоятельно реализовать, например так:
Код C
1
2
3
4
5
6
double round(double x)
{
* * if (x < 0)
* * * * return ceil(x - 0.5);
* * return floor(x + 0.5);
}
Добавлено через 1 минуту
Ну а про то, что в финансах double не используют я уже тоже говорил
Вот тебе код, чтобы ты удовлетворился, всё дело было в точности округления, если округляем до копейки то добавив к дробной части 10^-5 будем иметь погрешность 0,1% что считай ноль
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 + pow(0.1,4))<<" 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;
}
Изображения
 
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 22:05
Цитата Сообщение от easybudda Посмотреть сообщение
fract = (int)((val - floor(val)) * pow(10.0, PRECISION) + 0.5);
опять это зловещее 0,5О_о,ребят ну без него же ведь работает

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int(spart*100 + pow(0.1,4))
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
02.08.2011, 22:10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
опять это зловещее 0,5,ребят ну без него же ведь работает
А что в нём зловещего?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int(spart*100 + pow(0.1,4))
Это что?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 22:14
Ну просто зачем ещё 0,5 добавлять, почти во всех постах оно сквозит, достаточно добавить 10^-5 чтобы преобразование int() было корректным



Цитата Сообщение от easybudda Посмотреть сообщение
int(spart*100 + pow(0.1,4))
Это что?
ответ в коде в моём посте выше
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double fpart;
        double spart;
        do
        {
                cout<<"Enter double\r\n";
                cin>>val;
 
                fpart = floor(val);
                spart = (val - fpart);
                cout<<fpart<<" RU "<<int(spart*100 + pow(0.1,4))<<" KOP\r\n";
 
                cout<<"Celay chast'"<<fpart<<"\r\n";
                cout<<"Drobn chast'"<<spart<<"\r\n";
вобщем pow(0.1,4) - думаю можно сказать что это погрешность округления, вобще изначально мне не понятно почему int(spart*100) не давало желаемого результата, возможно дабл для системы представлябтся как 2.0 = 1,9(9) ???
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
02.08.2011, 22:23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вобщем pow(0.1,4) - думаю можно сказать что это погрешность округления, вобще изначально мне не понятно почему int(spart*100) не давало желаемого результата, возможно дабл для системы представлябтся как 2.0 = 1,9(9) ???
Вот и за чем это нужно, если прибавление 0.5 к округляемой величине даёт понятный и предсказуемый результат?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.08.2011, 22:25
Цитата Сообщение от diagon Посмотреть сообщение
Есть decimal в с#, есть длинная арифметика. Обычно их в финансах используют...
Отлично. Я очень рад за C#.

Цитата Сообщение от grizlik78 Посмотреть сообщение
Но повторю ещё раз. Код в исходном посте вполне рабочий и решает поставленную задачу. Вопрос был только в том, почему он такой.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну а про то, что в финансах double не используют я уже тоже говорил
Вот именно. Почему он такой? И при чем тут финансы-хринансы я вообще не пойму. Автор поста про финансы ни слова не сказал.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 22:31
Цитата Сообщение от easybudda Посмотреть сообщение
от и за чем это нужно, если прибавление 0.5 к округляемой величине даёт понятный и предсказуемый результат?
pow(0.1,4) - даёт тоже, ну и как мне кажется алгоритм внешне выглядит проще
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
fpart = floor(val);
* * * * * * * * spart = (val - fpart);
* * * * * * * * cout<<fpart<<" RU "<<int(spart*100 + pow(0.1,4))<<" KOP\r\n";
Чем разбирать дробную часть на цифры

Цитата Сообщение от easybudda Посмотреть сообщение
fract = (int)((val - floor(val)) * pow(10.0, PRECISION) + 0.5);
* * * * * * * * while ( fract && ! ( fract % 10 ) )
* * * * * * * * * * * * fract /= 10;
Цитата Сообщение от easybudda Посмотреть сообщение
(int)val
- если модуль val будет превосходить INT_MAX не будет потери точности вычислений???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2011, 22:31

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

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

Непонятки с выводом
Задание гласит: Вычислить приближенное значение конечной суммы с точностью e:0.0005 ...

Непонятки с сортировкой
Добрый вечер. Практически выполнил задание, но в конце возникла проблема с сортировкой, а именно, в задании нужно ввести название товара,...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru