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

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

Войти
Регистрация
Восстановить пароль
 
AK_U
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 22
#1

Как правильно округлить? - C++

05.02.2010, 00:47. Просмотров 641. Ответов 3
Метки нет (Все метки)

Кратко условие: произвожу ввод времени времени в формате hours/min/sec( переменные t1 и t2), перевожу в секунды, складываю и делаю перевод обратно. Происходит неправильное округление секунд:
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
29
30
31
#include <iostream>
using namespace std;
///////////////////////////////////////////////////
struct time
{
    int hours;
    int minutes;
    int seconds;
};
///////////////////////////////////////////////////
int main()
{
    char ch = '/';
    time t1, t2, t3;
    cout << "Input time1: ";
    cin >> t1.hours >> ch >> t1.minutes >> ch >> t1.seconds;
    cout << "Input time2: ";
    cin >> t2.hours >> ch >> t2.minutes >> ch >> t2.seconds;
    long totalsecs1 = t1.hours*3600 + t1.minutes*60 + t1.seconds;
    long totalsecs2 = t2.hours*3600 + t2.minutes*60 + t2.seconds;
    long totalsecs = totalsecs1 + totalsecs2;
    double temp = totalsecs / 3600.00;
    t3.hours = static_cast<int>(temp);
    temp -= t3.hours;
    temp *= 60;
    t3.minutes = static_cast<int>(temp);
    temp -= t3.minutes;
    t3.seconds = temp * 60;
    cout << "Time summ: " << t3.hours << ch << t3.minutes << ch << t3.seconds << endl; 
    return 0;
}
При вводе 1:1:1 и 1:1:1 выдает 2:2:1. Подскажите, как можно это исправить.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2010, 00:47     Как правильно округлить?
Посмотрите здесь:

как округлить число? - C++
нужно чтобы от числа F выводило только целую часть, пример f=5.4 ---&gt;5 f=5.8 ---&gt;5 как это сделать????

Как округлить число с 19 до 20 - C++
Вопрос в заголовке. Прошу подсказать.

Как округлить число до сотых? - C++
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Мне 11 лет, и я учусь программировать на С++. У меня есть программа,...

Как округлить число типо float? - C++
Как округлить число типо float до определенного числа знаков после запятой?

Округлить число - C++
Ну начнём))) Во-первых Visual Studio 10(Roudn и Trunc не видно) Во вторых float и cell +-.5 не подоходят так ,как числа могут поподаться...

округлить float - C++
int main() { setlocale(LC_ALL, &quot;rus&quot;); float Xmin,Xmax,Xdelta; cout&lt;&lt;&quot;Введите Xmin: &quot;; cin&gt;&gt;Xmin; cout&lt;&lt;&quot;Введите Xmax: &quot;; ...

Округлить выводимые данные - C++
Надо сделать что если х у вводиш милионами числами выводило норм.. спасайте вообще хз как #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Округлить числа с плавающей точкой - C++
Подскажите почему работает неправильно! Не округляет, а выдает только числа до запятой! Исправьте пожалуйста!! Вот задание: Строка...

Округлить заданное число до ближайшей сотни - C++
Помогите решить плиз Задано неотрицательное целое число N. Округлить до ближайшей сотни. 50 округлять вверх.

Округлить число не используя вещественненную арифметику - C++
Здравствуйте, есть два int a и b Они принимают какие-либо значения, как можно округлить результат их деления не используя вещественненную...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
05.02.2010, 01:21     Как правильно округлить? #2
Не нравятся мне тут операции деления всякие... сделал по другому. Алгоритм таков. Если число секунд превышает 60 то число минут плюсуется а секунды отнимаются на 60. Так делается в цикле. В итоге получаем остаток секунд и минуты. Тоже делается относительно часов\минут. Зато гарантированно...
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
29
30
31
32
bool drop(long& a, int max, int& b);
int main()
{
        char ch = '/';
        time t1, t2, t3;
        t3.hours = 0; t3.minutes = 0; t3.seconds = 0;
        cout << "Input time1: ";
        cin >> t1.hours >> ch >> t1.minutes >> ch >> t1.seconds;
        cout << "Input time2: ";
        cin >> t2.hours >> ch >> t2.minutes >> ch >> t2.seconds;
        long totalsecs1 = t1.hours*3600 + t1.minutes*60 + t1.seconds;
        long totalsecs2 = t2.hours*3600 + t2.minutes*60 + t2.seconds;
        long totalsecs = totalsecs1 + totalsecs2;
 
        while ( drop(totalsecs, 60, t3.minutes) );
        t3.seconds = totalsecs;
        long totalminutes = t3.minutes;
        while ( drop(totalminutes, 60, t3.hours) );
        t3.minutes = totalminutes;
        cout << "Time summ: " << t3.hours << ch << t3.minutes << ch << t3.seconds << endl; 
        return 0;
}
 
bool drop(long& a, int max, int& b)
{
    if ( a >= max )
    {
        b++; a -= max;
        return true;
    }
return false;
}
ps. Время не может быть отрицательным так что члены struct time должны быть unsigned
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.02.2010, 01:36     Как правильно округлить? #3
Цитата Сообщение от AK_U Посмотреть сообщение
При вводе 1:1:1 и 1:1:1 выдает 2:2:1. Подскажите, как можно это исправить.
Заранее спасибо.
t3.seconds = temp * 60;

твой "темп" в этот момент равен 0.033333333333331439

ты его умножаешь на 60 и получаешь 1.9999999999998863. при приведении к целому дробь отбрасывается и все дела.

обойдись без плавающей точки:

C++
1
2
3
4
5
6
...
long totalsecs = totalsecs1 + totalsecs2;
 
t3.hours = totalsecs / 3600;
t3.minutes = totalsecs % 3600 / 60;
t3.seconds = (totalsecs % 3600) % 60;
и получи 2.2.2
AK_U
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 22
05.02.2010, 13:26  [ТС]     Как правильно округлить? #4
insideone, твой вариант я пока не понимаю, т.к. функции еще не знаю, только поверхностно.(сам алгоритм мне понятен).
novi4ok, спасибо, все работает
Yandex
Объявления
05.02.2010, 13:26     Как правильно округлить?
Ответ Создать тему
Опции темы

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