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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить, попадает ли точка в заштрихованную область http://www.cyberforum.ru/cpp-beginners/thread149423.html
Попадает ли точка в заштрихованную область Примечание:Если точка попадает в заштрихованную область верхнего то треугольник движется по диагонали вверх и уменьшется, а если нижнего то вниз и уменьшается написать в с++ (визуальная среда)Надеюсь на вашу помощь! Вот рисунок:
C++ Одномерный массив в с++ 1.подготовить тексТовый файл с выходными данными в редакторе. 2. составить алгоритм программы 3.разбить программу на функции вывода , обработки . ввода выполнить обработку в соответствии с заданием вывести результаты на экран и дописать файл в одномерном массиве посчитать сумму элементов до минимального http://www.cyberforum.ru/cpp-beginners/thread149415.html
Переделать код из типа char в тип string C++
Прошу, помогите переделать код из типа char в тип string... В char'е все работает, но из-за незнания стринга не могу решить. Изначальная постановки задачи: "Исправить слово internet на слово INTERPOL, используя функции обработки строковых и символьных переменных. Слово internet вводитсяиз тхт файла. Результат дописать в файл"... #include <iostream.h> #include <windows.h> #include <conio.h>...
Алгоритмы вставки и выбора в С++ C++
Алгоритмы вставки и выбора в С++
C++ Текст в файле. удаление. http://www.cyberforum.ru/cpp-beginners/thread149379.html
Кто сможет, помогите, дано предложение: Влиятель ощущает невыразимое, пальцы его мнут и мнут глину. Нужно удалить: и мнут. Помогите, как это удалить из файла или вообще как удалить. Я вывожу текст из файла, дальше не понимаю как. С телефона тяжело искать в реете, ничего не нашёл. нужно это сделать через string. Помогите пожалуйста.
C++ Смена регистра в словах Помогите пожалуйста написать программу: Заданный текст превратить таким образом, чтобы каждое слово начиналось с большой буквы. Считать, что слова текста разделены одним пробелом. подробнее

Показать сообщение отдельно
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.10.2013, 12:12     Функция округления double
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
по какой причине он собака округляет мне 0.015 до 0.01 а не до 0.02 ручной расчет даст 0.02, собственно из-за этого и искал другое решение я не могу понять в чем косяк...
Проблема в том, что переменные 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 по модулю. Так что оба варианта в этом смысле равноценны.
 
Текущее время: 16:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru