Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/139: Рейтинг темы: голосов - 139, средняя оценка - 4.80
12 / 12 / 3
Регистрация: 09.05.2010
Сообщений: 384
1

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

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

Author24 — интернет-сервис помощи студентам
Как в С++ округлить double до int?
С помощью какой функции?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2010, 17:00
Ответы с готовыми решениями:

Функция округления
Добрый вечер,дала задание написать свою функцию округления числе,и применить её на своем...

Функция округления чисел
Здравствуйте, подскажите пожалуйста. Написала функцию округления цифр void...

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

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

22
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.06.2010, 17:04 2
C++
1
2
3
4
5
6
7
#include <iostream>
int main()
{
    double s;
    std::cout<<"Enter s\n";std::cin>>s;
    std::cout<<"Int s: "<< (int)s <<'\n';
}
Так не пойдет? Просто преобразование типа в int
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
25.06.2010, 17:05 3
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main(){
    double dval;
    int ival;
    std::cout << "double value = ";
    std::cin >> dval;
    ival = static_cast<int>(dval + 0.5);
    std::cout << "int value = " << ival << std::endl;
    return 0;
}
Добавлено через 32 секунды
Lavroff, так только дробную часть откинет
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.06.2010, 17:07 4
easybudda, Да точно. Подтупил. Не учел что после 6 идет округление в сторону большего числа.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
25.06.2010, 17:08 5
Цитата Сообщение от Lavroff Посмотреть сообщение
после 6 идет округление в сторону большего числа.
начиная с 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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <fstream>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
   
string IntToStr(double Val)
{      
    string result;
    std::stringstream ost;
    ost << std::fixed << std::setprecision(20) << ( 22.0 / 7.0 );
    ost << Val;
    result = ost.str();
    return result;
}
 
double Round(double Argument, int Preception)
{
    double s,result;
    string z;
    int znak,k,i;
    znak=fabs(Argument)/Argument;
    Argument=fabs(Argument);
    z=IntToStr(Argument);
    k=z.size()-2;
    Argument=Argument*pow(10.0,double(Preception));
    s=0.5;
    for (i=1;i<=k-2;i++)
        s=s+s*pow(10,double(-i));
    result=znak*floor(Argument+s)/pow(10.0,double(Preception));
    return result;
}
Вот это работает точно по правилам... Благодарю за помощь easybudda.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
27.10.2013, 09:59 10
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Не один из увиденных способов не округляет по правилам математики а floor(v+0.5) дает округление для дробных с 3 знаками после запятой если 4 например 0.4445 данный алгоритм не пашет надо менять на floor(v+0.55)
общий способ округления
умножить число на 10 в степени сколько знаков нужно округлить
прибавить 0.5
привести к целочисленным
разделить на 10 в степени сколько знаков нужно округлить
например
нужно округлить 1.2345679 до сотых
C++
1
2
3
4
double a=1.2345679;
double b=a*100.0;
int tmp=b+0.5;
b= (double)tmp/100.0;
0
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 10:06 11
Цитата Сообщение от ValeryS Посмотреть сообщение
общий способ округления
умножить число на 10 в степени сколько знаков нужно округлить
прибавить 0.5
привести к целочисленным
разделить на 10 в степени сколько знаков нужно округлить
например
нужно округлить 1.2345679 до сотых
C++
1
2
3
4
double a=1.2345679;
double b=a*100.0;
int tmp=b+0.5;
b= (double)tmp/100.0;
даст ошибку при X=0.444444444445, да и в вашем примере сами прощитайте алгоритм ответ будет 1.23
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.10.2013, 10:34 12
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
да и в вашем примере сами прощитайте алгоритм ответ будет 1.23
Конечно 1.23. И это правильный ответ!
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
27.10.2013, 10:37 13
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
даст ошибку при X=0.444444444445,
какую?
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
ответ будет 1.23
А сколько должен быть?
0
18 / 18 / 3
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 10:41 14
Цитата Сообщение от grizlik78 Посмотреть сообщение
Конечно 1.23. И это правильный ответ!
Да ну ребят вы чего 1.24 разве нет ну тогда учите математику)

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
какую?
А сколько должен быть?
ошибку такую даст ответ 4.44 а не 4.45 как должно быть, и правильный ответ в вашем примере 1.24
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.10.2013, 10:48 15
Ну ладно мы неграмотные. И в C++ нет функции гтовой для округления до сотых. Но вот разработчики питона тоже неграмотные, оказывается.
$ python -c "print round(1.2345679, 2)"
1.23

$ python -c "print round(0.4444444445, 2)"
0.44
Ага.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
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
18 / 18 / 3
Регистрация: 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
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
27.10.2013, 11:11 18
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
я не собираюсь спорить так как я новичок в с++ по крайней мере)
это не С++, это математика средней школы
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
ссылку на тему
1
18 / 18 / 3
Регистрация: 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
27.10.2013, 12:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2013, 12:12
Помогаю со студенческими работами здесь

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

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

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double...

Вывести double без округления
Рассматриваю пример. public string Square(int a = 13, int h = 3) { double...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru