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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
#1

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

26.06.2013, 06:36. Просмотров 1086. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с округлением вещественных чисел (C++):

Среди 5 вещественных чисел найти количество чисел, принадлежащих отрезку от -5 до 7 - C++
Написать программу которая среди 5 вещественных чисел находит кол-во чисел принадлежащих отрезку от -5 до 7

Дано n вещественных чисел, которые вводятся с клавиатуры. Вычислить сумму чисел, кратных 3 - C++
Помогите, пожалуйста. Дано n вещественных чисел, которые вводятся с клавиатуры. Вычислить сумму чисел, кратных 3.

Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20 - C++
Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20. Добавлено через 53 секунды...

Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20. - C++
Вводится последовательность из N вещественных чисел. Определить наименьшее число, среди чисел больших 20.

Ввести целое число и набор из вещественных чисел, вывести сумму и произведение чисел из набора - C++
ввести целое число N (больше 0) и набор из N вещественных чисел вывести сумму и произведение чисел из данного набора

В последовательности вещественных чисел подсчитать произведение чисел, кратных 3 - C++
В последовательности вещественных чисел подсчитать произведение чисел, кратных 3.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,522
26.06.2013, 12:48 #2
ссылки по этой теме
Смысл обьединений

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

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

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

Добавлено через 3 минуты
ещё вот Округление double
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 12:48
Привет! Вот еще темы с ответами:

Как разделить число с округлением вверх? - C++
Добрый вечер дамы и господа. задача: Улитка ползет по вертикальному шесту высотой H метров, поднимаясь за день на A метров, а за...

Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах) - C++
Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах. Обьясните что делать?

Вывод чисел, стоящих на четных местах, в десятичной с.с., а чисел, стоящие на нечетных местах, как вещественных с одним знаком после запятой - C++
В файле a.txt задано 10 целых чисел в восьмеричной системе счисления. Выведите числа, стоящие на четных местах в десятичной системе...

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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