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

Функция округления double - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 124, средняя оценка - 4.98
AKE
11 / 11 / 0
Регистрация: 09.05.2010
Сообщений: 384
25.06.2010, 17:00     Функция округления double #1
Как в С++ округлить double до int?
С помощью какой функции?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 12:21     Функция округления double #21
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Ребят ну вот код
Зачем так извращаться.
C++
1
2
3
4
double my_round( double value, int precision ) {
    value *= precision;
    return (value > 0 ? ceil( value ) : floor( value )) / precision;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
27.10.2013, 13:00     Функция округления double #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
Проблема в том, что переменные double не могут сохранить число 0.015 абсолютно точно. Число, которое хранится в переменной будет немного меньше, где-то 0.01499999999999999944489, или около того. И если это число округлять до сотых, то на самом деле должно получится 0.01, но ведь мы задавали другое число изначально, и то число должно округлится к 0.02. Отсюда и возникает желание округлять последовательно с самого младшего разряда. Но задача эта принципиально не имеет решения, поскольку информация о точном числе при представлении типом double уже потеряна и невозможно отличить число 0.015 от числа 0.01499999999999999944489, а ведь они при округлении должны дать разный результат.
тема эта уже поднималась в
Округление числа в C++Builder
посмотри наш спор с Evg,
действительно в doudle нельзя представить точную конечную десятичную дробь, если она не степень двойки
поэтому приходится или вводить погрешность или менять алгоритм
например можно сначала умножить на 15 а потом разделить на 1000
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 14:14     Функция округления double
Еще ссылки по теме:

C++ Функция округления чисел
Функция округления вещественного числа с заданой точностью C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

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

Или воспользуйтесь поиском по форуму:
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 14:14     Функция округления double #23
Цитата Сообщение от grizlik78 Посмотреть сообщение
Проблема в том, что переменные double не могут сохранить число 0.015 абсолютно точно. Число, которое хранится в переменной будет немного меньше, где-то 0.01499999999999999944489, или около того. И если это число округлять до сотых, то на самом деле должно получится 0.01, но ведь мы задавали другое число изначально, и то число должно округлится к 0.02. Отсюда и возникает желание округлять последовательно с самого младшего разряда. Но задача эта принципиально не имеет решения, поскольку информация о точном числе при представлении типом double уже потеряна и невозможно отличить число 0.015 от числа 0.01499999999999999944489, а ведь они при округлении должны дать разный результат.
Кстати, любой из результатов, 0.01 или 0.02, тоже нельзя представить в double точно.
Для получения более-менее ожидаемых результатов универсального решения нет. Можно сначала округлить до какого-нибудь более младшего разряда, например до миллиардной доли чтобы "скомпенсировать" ошибку представления числа, а потом уже округлять до сотых. Но уж точно не идти от младшего разряда к старшему, накапливая ошибку округления.
Можно воспользоваться строковым представлением, вроде того, что у тебя, но ориентироваться только на цифру следующую за разрядом, до которого нужно округлять. Тогда первое округление сделает функция перевода числа в строку, то есть это по-сути предыдущий вариант.

Добавлено через 3 минуты
А с точки зрения практических результатов обычно нет разницы куда округлять 0.015. Хоть к 0.01, хоть к 0.02 — в обоих случаях ошибка составит 0.005 по модулю. Так что оба варианта в этом смысле равноценны.
Спасибо за точное разъяснение)))
Yandex
Объявления
27.10.2013, 14:14     Функция округления double
Ответ Создать тему
Опции темы

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