4 / 4 / 0
Регистрация: 25.06.2010
Сообщений: 106

непонятки

02.08.2011, 13:40. Показов 8746. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru