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

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

Восстановить пароль Регистрация
 
AK_U
 Аватар для AK_U
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 22
05.02.2010, 00:47     Как правильно округлить? #1
Кратко условие: произвожу ввод времени времени в формате 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     Как правильно округлить?
Посмотрите здесь:

Как округлить в С++ вещественное число до 2 знаков после запятой? C++
как округлить число? C++
C++ Как округлить число типо float?
Округлить выводимые данные C++
C++ Округлить число
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
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
549 / 502 / 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
 Аватар для AK_U
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 22
05.02.2010, 13:26  [ТС]     Как правильно округлить? #4
insideone, твой вариант я пока не понимаю, т.к. функции еще не знаю, только поверхностно.(сам алгоритм мне понятен).
novi4ok, спасибо, все работает
Yandex
Объявления
05.02.2010, 13:26     Как правильно округлить?
Ответ Создать тему
Опции темы

Текущее время: 13:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru