Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:04     Функция округления double #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
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 17:05     Функция округления double #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, так только дробную часть откинет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:07     Функция округления double #4
easybudda, Да точно. Подтупил. Не учел что после 6 идет округление в сторону большего числа.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 17:08     Функция округления double #5
Цитата Сообщение от Lavroff Посмотреть сообщение
после 6 идет округление в сторону большего числа.
начиная с 5, если точнее
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:09     Функция округления double #6
easybudda, ну вообщем, вы меня поняли)
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
25.06.2010, 18:00     Функция округления double #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В библиотеке math.h есть функции floor и ceil, округляющие в меньшую и большую сторону соответственно. Чтобы округлять от положительные числа от половины, можно написать floor(value + 0.5);
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
23.10.2013, 15:51     Функция округления double #8
Не один из увиденных способов не округляет по правилам математики а floor(v+0.5) дает округление для дробных с 3 знаками после запятой если 4 например 0.4445 данный алгоритм не пашет надо менять на floor(v+0.55) соответственно 5 знаков тоесть 0.44445 надо менять на floor (v+0.555) и по аналогии... Кто подскажет как проверит количество знаков после запятой у любого дробного числа???? Необходимо точное округление для мат. статистики.
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 09:48     Функция округления double #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.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
27.10.2013, 09:59     Функция округления double #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;
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 10:06     Функция округления double #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
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.10.2013, 10:34     Функция округления double #12
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
да и в вашем примере сами прощитайте алгоритм ответ будет 1.23
Конечно 1.23. И это правильный ответ!
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
27.10.2013, 10:37     Функция округления double #13
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
даст ошибку при X=0.444444444445,
какую?
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
ответ будет 1.23
А сколько должен быть?
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 10:41     Функция округления double #14
Цитата Сообщение от grizlik78 Посмотреть сообщение
Конечно 1.23. И это правильный ответ!
Да ну ребят вы чего 1.24 разве нет ну тогда учите математику)

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

$ python -c "print round(0.4444444445, 2)"
0.44
Ага.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
27.10.2013, 10:49     Функция округления double #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, то усиления не производится.
если ты считаешь что нужно идти с конца
то как ты будешь округлять бесконечную дробь????
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 11:00     Функция округления double #17
Цитата Сообщение от ValeryS Посмотреть сообщение
может сам поучишь математику?


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

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


если ты считаешь что нужно идти с конца
то как ты будешь округлять бесконечную дробь????
Так ладно возможно я что-то напутал и я не собираюсь спорить так как я новичок в с++ по крайней мере) И с округлением я наверное перемудрил) Но почему то в моей башке именно такой принцип округления и из-за этого я накерачил этот код, создав себе лишних трудностей...
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
27.10.2013, 11:11     Функция округления double #18
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
я не собираюсь спорить так как я новичок в с++ по крайней мере)
это не С++, это математика средней школы
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
И ребят если не сложно посмотрите темку в разделе с++ для начинающих работа с текстовыми файлами очень срочно нужно решить проблемку никак не могу сообразить, пожалуйста.
ссылку на тему
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 11:33     Функция округления double #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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 12:12     Функция округления double
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.10.2013, 12:12     Функция округления double #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 по модулю. Так что оба варианта в этом смысле равноценны.
Yandex
Объявления
27.10.2013, 12:12     Функция округления double
Ответ Создать тему
Опции темы

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