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

Проблемы с округлением вещественных чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
26.06.2013, 06:36     Проблемы с округлением вещественных чисел #1
В общем то сабж. Уже треть гугла перерыл, но вразумительного решения так и не нашёл.

Visual C++ (2005)

Нашёл по округлению 2 функции : floor и ceil.
Они обе не работают или работают не правильно.

Есть множество чисел типа Float, честно говоря если был бы вариант с типом 2 точек после запятой - я был бы рад, но такого нет, потому использую float. Нужно оставить только 2 числа после запятой, при этом округлив по правилам математики их.
Если я использую стандартную функцию floor, например:
C++
1
ebuf=floor((ebuf) * 100 + 0.5) / 100;
где естественно float ebuf. То результат вывода числа не изменяется, покопавшись в инете, нашёл кучу доводов об экпаненте и особенностях ОС(разрядах системы), где типа говорится что округляй ни округляй, а в итоге получиш число с (например) 5-ым знаком после запятой, меня это не устраивает.
Напрашиваются несколько вопросов:
1. Возможно есть какие то другие способы округления?
2. Возможно стоит писать функцию самому, которая будет брать вещественное число исходя из кол-ва его символов, и посимвольно удалять их, предварительно округляя?(кстати, как узнать кол-во символов вещественного числа?)
3. Ф-я round не поддерживается 2005\2009 студиями, стоит ли их переписать самому? - если они дадут правильный результат...
4. В итоге я эти float числа должен вывести по отдельности, суммировать и вывести в эксель общее, я понял что sprintf с "%.3f" дадут мне нужный вывод, однако оно не округляет число, и общий результат останется не округлённым, а исходя из кол-ва чисел, у меня их больше 500 - будет потеря в сотни\тысячи, что не очень хорошо...
5. Можно ли создать свой тип данных с 2 точками после запятой? =)
6. Возможно есть темы в которых уже данный вопрос решался, а я его пропустил из виду, и вы случайно имеете ссылку на обсуждение данного вопроса =)

За ранее, спасибо за помощь)

Добавлено через 11 часов 25 минут
Не уж то это действительно такой тяжёлый вопрос, что мне придётся писать собственную функцию разбора и округления через преобразование в char, а потом сравнение каждого эл-а до strlen(ebuf), а потом опять в флоат?... Ппц очень накладно получится =(

Добавлено через 3 часа 49 минут
Так, я решил протестировать ф-ю floor не в моём проэкте, а в обычном преложении...
Результат меня удивил:
C++
1
2
3
4
5
float x;
    cout << " Vvedite drobnoe 4iclo ";
    cin >> x;
    x = int(x*100 + 0.5)/100.0;
    cout << "\n New Float = " << x << endl;
На выходе я получаю 2 знака после запятой... Что меня вообще повергло в шок.
В моей программе даже этого не происходит.
C++
1
2
3
4
float ebuf=3.654745;
char vivod[i].cfeb[25]="";//это вообще то строка из структуры...
ebuf = int(ebuf*100 + 0.5)/100.0;
sprintf(vivod[i].cfeb,"%f",ebuf);//можно через "%.2f", но оно не округляет
После чего, переменная vivod[i].cfeb выводится в эксель... Только вот даже после присутствия ф-ии floor() результат не изменяется, как было 6 знаков после запятой, так и остаётся...

Добавлено через 5 минут
Такое ощущение, что выводится результат типа abs(), может оно так и есть?... Только вот что именно его делает таким? - функция sprintf или сам эксель?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2013, 06:36     Проблемы с округлением вещественных чисел
Посмотрите здесь:

В последовательности вещественных чисел подсчитать произведение чисел, кратных 3 C++
C++ Целочисленное деление с округлением - пограмма готовая, только округление...
Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20. C++
C++ Вывод чисел, стоящих на четных местах, в десятичной с.с., а чисел, стоящие на нечетных местах, как вещественных с одним знаком после запятой
C++ Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20
C++ Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах)
C++ Дано n вещественных чисел, которые вводятся с клавиатуры. Вычислить сумму чисел, кратных 3
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
26.06.2013, 12:48     Проблемы с округлением вещественных чисел #2
ссылки по этой теме
Смысл обьединений

Число double 0.1 на самом деле не 0.1

От перемены мест слагаемых сумма меняется

Добавлено через 15 минут
ну или умножить double на 100
потом Функция округления double
и разделить на 100

Добавлено через 3 минуты
ещё вот Округление double
Yandex
Объявления
26.06.2013, 12:48     Проблемы с округлением вещественных чисел
Ответ Создать тему
Опции темы

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