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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 124, средняя оценка - 4.98
AKE
11 / 11 / 0
Регистрация: 09.05.2010
Сообщений: 384
#1

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

25.06.2010, 17:00. Просмотров 16554. Ответов 22
Метки нет (Все метки)

Как в С++ округлить double до int?
С помощью какой функции?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2010, 17:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция округления double (C++):

Функция округления чисел - C++
Здравствуйте, подскажите пожалуйста. Написала функцию округления цифр void RoundingFunction(double RoundingVariable, int&...

Функция округления вещественного числа с заданой точностью - C++
Написать функцию,которая принимает в качестве параметров вещественное число и количество знаков после десятичной точки,которые должны...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

Функция floor для округления значения до определённого числа знаков дробной части - C++
Всем привет ребята. кто мог бы объяснить где и что неправильно у меня в коде и как это исправить. Благодарю за внимание. Условие задачи:...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include <iostream> #include <cmath> using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,853
27.10.2013, 10:49 #16
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Да ну ребят вы чего 1.24 разве нет ну тогда учите математику)
может сам поучишь математику?

Цитата Сообщение от Alex_Skripa Посмотреть сообщение
ошибку такую даст ответ 4.44 а не 4.45 как должно быть, и правильный ответ в вашем примере 1.24
1.2345679-1.124=-0,0054321
1.2345679-1.123= 0,0045679

какая погрешность больше 0,0054321 или 0,0045679???
Первое правило

Если первая из отделяемых цифр больше, чем число 5, то последняя из оставляемых цифр усиливается, иначе говоря, увеличивается на единицу. Усиление так же предполагается и тогда, когда первая из убираемых цифр равна 5, а за ней имеется одна или некоторое количество значащих цифр.
Второе правило

В случае если первая из отсекаемых цифр меньше чем 5, то усиления не производится.
если ты считаешь что нужно идти с конца
то как ты будешь округлять бесконечную дробь????
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 11:00 #17
Цитата Сообщение от ValeryS Посмотреть сообщение
может сам поучишь математику?


1.2345679-1.124=-0,0054321
1.2345679-1.123= 0,0045679

какая погрешность больше 0,0054321 или 0,0045679???


если ты считаешь что нужно идти с конца
то как ты будешь округлять бесконечную дробь????
Так ладно возможно я что-то напутал и я не собираюсь спорить так как я новичок в с++ по крайней мере) И с округлением я наверное перемудрил) Но почему то в моей башке именно такой принцип округления и из-за этого я накерачил этот код, создав себе лишних трудностей...
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
0
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,853
27.10.2013, 11:11 #18
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
я не собираюсь спорить так как я новичок в с++ по крайней мере)
это не С++, это математика средней школы
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
ссылку на тему
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 11:33 #19
Цитата Сообщение от ValeryS Посмотреть сообщение
это не С++, это математика средней школы

ссылку на тему
Работа с текстовыми файлами си++
И да я знаю что это математика средней школы, и я сам себя запутал усложнил себе жизнь, да еще нашел не верное решение, а то что я написал новичок в с++ это не про округление)
Да и спасибо за то что наставили на путь истинный)

Добавлено через 8 минут
И у меня еще отлично по математике вышка) стыдно

Добавлено через 1 минуту
И приношу свои извинения если кого-то огорчил...

Добавлено через 10 минут
Ребят ну вот код
double Round(double Argument, int Preception)
{
int znak;
znak=fabs(Argument)/Argument;
Argument=fabs(Argument);
Argument=Argument*pow(10,double(Preception));
return znak*floor(Argument+0.5)/pow(10,double(Preception));
}
по какой причине он собака округляет мне 0.015 до 0.01 а не до 0.02 ручной расчет даст 0.02, собственно из-за этого и искал другое решение я не могу понять в чем косяк... Причем 0.855 округляет правильно как 0.86
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
27.10.2013, 12:12 #20
Цитата Сообщение от 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 по модулю. Так что оба варианта в этом смысле равноценны.
2
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 12:21 #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;
}
0
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,853
27.10.2013, 13:00 #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
Проблема в том, что переменные double не могут сохранить число 0.015 абсолютно точно. Число, которое хранится в переменной будет немного меньше, где-то 0.01499999999999999944489, или около того. И если это число округлять до сотых, то на самом деле должно получится 0.01, но ведь мы задавали другое число изначально, и то число должно округлится к 0.02. Отсюда и возникает желание округлять последовательно с самого младшего разряда. Но задача эта принципиально не имеет решения, поскольку информация о точном числе при представлении типом double уже потеряна и невозможно отличить число 0.015 от числа 0.01499999999999999944489, а ведь они при округлении должны дать разный результат.
тема эта уже поднималась в
Округление числа в C++Builder
посмотри наш спор с Evg,
действительно в doudle нельзя представить точную конечную десятичную дробь, если она не степень двойки
поэтому приходится или вводить погрешность или менять алгоритм
например можно сначала умножить на 15 а потом разделить на 1000
1
Alex_Skripa
18 / 18 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 14:14 #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 по модулю. Так что оба варианта в этом смысле равноценны.
Спасибо за точное разъяснение)))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 14:14
Привет! Вот еще темы с ответами:

выдает ошибку в условии, функция double - C++
//*************************************************************************************\\ ///////////////////////////////ЗАДАНИЕ...

Функция для преобразования double в строку символов. - C++
Написать функцию для преобразования переменной типа double в строку символов с заданной точностью представления ( dtoa( double num, int...

функция принимает два параметра типа double и возвращает значение типа double - C++
Напишите функцию, которая принимает два параметра типа double и возвращает значение типа double, содержащее их минимум....

Какая функция определяет количество знаков после запятой переменной double? - C++
У меня есть программа, которая считает сумму ряда, в неё вводится значение x, точность, с которой определяется значение ln(x) и по формуле...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.10.2013, 14:14
Ответ Создать тему
Опции темы

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