Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
1

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

26.06.2013, 06:36. Показов 4159. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем то сабж. Уже треть гугла перерыл, но вразумительного решения так и не нашёл.

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 или сам эксель?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2013, 06:36
Ответы с готовыми решениями:

проблемы с округлением в PHP
Столкнулся с такой проблемой при выполнении лабораторной работы. При округлении переменной, она...

Проблема с округлением чисел
Есть функция, получающая дробную часть числа в системе счисления с основанием p void...

Найти суммы двух случайных чисел. a) целых чисел из диапазона от 50 до 100 b) вещественных чисел от 3х с половиной до 8
помогите решить Найти суммы двух случайных чисел. a) целых чисел из диапазона от 50 до 100 b)...

Дан файл вещественных чисел. Подсчитать среднее значение чисел большее 3
Файл уже заполнен. Не надо его заполнять на рандоме. Помогите пожалуйста.

1
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
26.06.2013, 12:48 2
ссылки по этой теме
Смысл обьединений

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

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

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

Добавлено через 3 минуты
ещё вот Округление double
1
26.06.2013, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2013, 12:48
Помогаю со студенческими работами здесь

Дан массив вещественных случайных чисел. Подсчитать сумму положительных чисел
Дан массив вещественных случайных чисел (размер массива определяет пользователь, но в диапазоне )....

В файле из 10 вещественных чисел сделать первые пять чисел последними и наоборот
В файле из 10 вещественных чисел сделать первые пять чисел последними и наоборот.

Массив вещественных чисел. Выбрать среди положительных чисел наименьшее значение
Здравствуйте! Помогите решите задачу. Заранее спасибо! Создать массив вещественных чисел....

Программа определения максимального по модулю чисел из массива вещественных чисел
Помогите пожалуйста, если не сильно сложно. Разработать программу определения максимального по...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru