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

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

26.06.2013, 06:36. Показов 4482. Ответов 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 или сам эксель?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.06.2013, 06:36
Ответы с готовыми решениями:

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

Проблема с округлением чисел
Есть функция, получающая дробную часть числа в системе счисления с основанием p void dectox_double(double a, int p, char *s) { int...

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

1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
26.06.2013, 12:48
ссылки по этой теме
Смысл обьединений

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

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

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

Добавлено через 3 минуты
ещё вот Округление double
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2013, 12:48
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru