12 / 12 / 3
Регистрация: 09.05.2010
Сообщений: 384
|
|
1 | |
Функция округления double25.06.2010, 17:00. Показов 27503. Ответов 22
Метки нет (Все метки)
0
|
25.06.2010, 17:00 | |
Ответы с готовыми решениями:
22
Функция округления Функция округления чисел Функция округления вещественного числа с заданной точностью Функция округления вещественного числа с заданой точностью |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
25.06.2010, 17:04 | 2 | |||||
0
|
Модератор
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
|
||||||
25.06.2010, 17:05 | 3 | |||||
Lavroff, так только дробную часть откинет
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.06.2010, 17:07 | 4 |
easybudda, Да точно. Подтупил. Не учел что после 6 идет округление в сторону большего числа.
0
|
Модератор
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
|
|
25.06.2010, 17:08 | 5 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.06.2010, 17:09 | 6 |
easybudda, ну вообщем, вы меня поняли)
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
25.06.2010, 18:00 | 7 |
Сообщение было отмечено как решение
Решение
В библиотеке math.h есть функции floor и ceil, округляющие в меньшую и большую сторону соответственно. Чтобы округлять от положительные числа от половины, можно написать floor(value + 0.5);
4
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
|
23.10.2013, 15:51 | 8 |
Не один из увиденных способов не округляет по правилам математики а floor(v+0.5) дает округление для дробных с 3 знаками после запятой если 4 например 0.4445 данный алгоритм не пашет надо менять на floor(v+0.55) соответственно 5 знаков тоесть 0.44445 надо менять на floor (v+0.555) и по аналогии... Кто подскажет как проверит количество знаков после запятой у любого дробного числа???? Необходимо точное округление для мат. статистики.
0
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
||||||
27.10.2013, 09:48 | 9 | |||||
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
||||||
27.10.2013, 09:59 | 10 | |||||
общий способ округления
умножить число на 10 в степени сколько знаков нужно округлить прибавить 0.5 привести к целочисленным разделить на 10 в степени сколько знаков нужно округлить например нужно округлить 1.2345679 до сотых
0
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
|
27.10.2013, 10:06 | 11 |
даст ошибку при X=0.444444444445, да и в вашем примере сами прощитайте алгоритм ответ будет 1.23
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.10.2013, 10:34 | 12 |
0
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
|
27.10.2013, 10:41 | 14 |
Да ну ребят вы чего 1.24 разве нет ну тогда учите математику)
Добавлено через 1 минуту ошибку такую даст ответ 4.44 а не 4.45 как должно быть, и правильный ответ в вашем примере 1.24
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.10.2013, 10:48 | 15 |
Ну ладно мы неграмотные. И в C++ нет функции гтовой для округления до сотых. Но вот разработчики питона тоже неграмотные, оказывается.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
27.10.2013, 10:49 | 16 |
может сам поучишь математику?
1.2345679-1.124=-0,0054321 1.2345679-1.123= 0,0045679 какая погрешность больше 0,0054321 или 0,0045679??? то как ты будешь округлять бесконечную дробь????
1
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
|
27.10.2013, 11:00 | 17 |
Так ладно возможно я что-то напутал и я не собираюсь спорить так как я новичок в с++ по крайней мере) И с округлением я наверное перемудрил) Но почему то в моей башке именно такой принцип округления и из-за этого я накерачил этот код, создав себе лишних трудностей...
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
0
|
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
|
|
27.10.2013, 11:33 | 19 |
Работа с текстовыми файлами си++
И да я знаю что это математика средней школы, и я сам себя запутал усложнил себе жизнь, да еще нашел не верное решение, а то что я написал новичок в с++ это не про округление) Да и спасибо за то что наставили на путь истинный) Добавлено через 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
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.10.2013, 12:12 | 20 |
Проблема в том, что переменные 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
|
27.10.2013, 12:12 | |
27.10.2013, 12:12 | |
Помогаю со студенческими работами здесь
20
Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Функция floor для округления значения до определённого числа знаков дробной части Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" Вывести double без округления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |