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

double + cout

14.10.2012, 15:42. Показов 18625. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Через cout вывожу double.

C++
1
2
double a =  48.799999999999997;
cout << a;
Выводит: 48.8.

Как сделать, что бы не округляло?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 15:42
Ответы с готовыми решениями:

cout (double)
Всем привет! Подскажите плз как вывести число типа дабл при помощи cout так чтобы были видны...

double a=1/2; cout<<a;(a=0) что не так?
#include &lt;iostream&gt; using namespace std; void main() { double a=1/2; cout&lt;&lt;a; }...

Неправильно работает cout для чисел типа double и float
Здравствуйте. Скажите, почему эта программа выводит на экран число 2, а не 2.5 ? #include...

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

27
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
14.10.2012, 15:49 2
C++
1
2
3
double a =  48.799999999999997;
cout.precision(20);
cout << a;
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 15:49 3
http://www.cplusplus.com/refer... precision/
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:03  [ТС] 4
С помощью точности я и так могу. Мне нужно с исходной точностью, но что бы не округляло

Добавлено через 10 минут
вверх
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:03 5
При выводе double в десятичной системе счисления в любом случае происходит округление, отбрасывающее незначащие десятичные цифры (внутри ведь хранится двоичное число). Так что ставьте precision(100500) и получайте истинно хранимое внутри число, если так уж надо.
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:06  [ТС] 6
~OhMyGodSoLong~, рисуется таблица. В консоли. Поэтому поставить слишком большую точность не представляется возможным.

Отладчик vs2012 показывает значение 48.799999999999997. Как вывести число с исходной точностью, но не округляя его? И не используя самописных алгоритмов.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:09 7
Что значит исходная точность? Какой она должна быть?

Вон то число 48.799999999999997 — это на самом деле число 48.7999999999999971578290569595992565155029296875 в памяти из-за особенностей представления чисел с плавающей точкой. double хранит примерно от 15 до 16 десятичных значащих цифр числа (точное количество зависит от самого числа). Для гарантии выводится 17 цифр (одна потенциально незначащая).

Вот с такой точностью? Меньшей? Большей?
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:17  [ТС] 8
~OhMyGodSoLong~, с той точностью, которая сейчас установлена в cout с помощью функции setprecision. Неужели в cout нету ни одного флага, отвечающего за округление?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:43 9
Я не понял, в чём проблема?
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
 
int main()
{
  std::cout.precision(5);
  std::cout << 5.123456789 << "\n";
  std::cout << std::setprecision(3) << 5.123456789 << "\n";
  std::cout << 5.123456789 << "\n";
}
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
14.10.2012, 16:54 10
Цитата Сообщение от Kgfq Посмотреть сообщение
Как вывести число с исходной точностью
Никак. Потому что данное число изначально нельзя представить точно в двоичном виде. Если, к примеру, взять число 1/3, то ты его в принципе не сможешь напечатать точно в десятичной системе счисления. В зависимости от количество печатаемых знаков можно напечатать как "0.3", "0.33", "0.333" и т.д. Но ты никогда его точно не напечатаешь. В твоей исходной задаче проблема та же самая: ты пишешь в программе число в десятичном виде, а оно не может быть точно переведено в двоичный вид (потому что машина хранит данные в двоичном виде), а следовательно, не может быть в дальнейшем точно напечатано
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 17:23  [ТС] 11
Evg, а если я хочу, что бы вывело 48.799999 и все?
ведь можно просто "обрезать" конец?

не самописными функциями
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 17:33 12
А, вы про это. Нет, cout, к сожалению, не умеет нормально контролировать способ округления чисел. Только к ближайшему. Можно разве что заставить его выводить как 48.800000 (манипулятор fixed).
1
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 19:36  [ТС] 13
Странно, что разработчики STL не подумали об этом...
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.10.2012, 11:06 14
Цитата Сообщение от Kgfq Посмотреть сообщение
ведь можно просто "обрезать" конец?
Просто обрезать нельзя, можно только округлять

Цитата Сообщение от Kgfq Посмотреть сообщение
Странно, что разработчики STL не подумали об этом...
О чём? О неправильном округлении?
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.10.2012, 15:55  [ТС] 15
Evg, о выводе БЕЗ округления вовсе
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.10.2012, 16:11 16
Цитата Сообщение от Kgfq Посмотреть сообщение
Evg, о выводе БЕЗ округления вовсе
Без округления это число будет выглядеть как бесконечная последовательность. Просто разработчики stl знают о том, как в машине хранятся плавающие числа, а ты - нет. Потому они понимают невозможность решения задачи в такой постановке, а ты - нет

Возьми пример из поста #20 и вместо 20 подставь 50, 100, 200 и т.д. Может после этого ты начнёшь всё-таки понимать, о чём тебе тут говорят. Если нет, тогда либо забей на этот вопрос, либо сядь и конкретно разберись с представлением плавающих чисел на машине. Потому что без этого ты никогда не поймёшь бредовость своей постановки задачи
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
15.10.2012, 16:48  [ТС] 17
Evg,

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
38
#include <iostream>
#include <sstream>
using namespace std;
 
void Out(double out, int prec)
{
    ostringstream oss;
    oss.precision(20);
    oss << out;
    string out_s = oss.str(), out_o;
    for(unsigned int j = 0; j < out_s.length(); ++j)
    {
        out_o += out_s[j];
 
        if(out_s[j] == '.')
        {
            for(unsigned int i = j+1; i < j + prec + 1 && i < out_s.length(); ++i)
            {
                out_o += out_s[i];
            }
            
            goto qwe;
        }
    }
 
    qwe:;
    cout << out_o;
}
 
 
int main()
{
    Out(48.7999999999999, 5);
 
    cout << "\n\n";
    system("pause");
    return 0;
}
Evg, бесконечная? ага.
Если это можно сделать самому, то разрабы стл тем более могли написать.

Добавлено через 1 минуту
Кстати, выведет 48.79999
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.10.2012, 19:47 18
Цитата Сообщение от Kgfq Посмотреть сообщение
Evg, бесконечная?
Господи, ну почему же ты не читаешь, что тебе пишут? В 8-й строке замени "20" на "30", а в 33-й - "5" на "30". И почему же в итоге число-то такое кривое выводится, совсем не такое, какое писал ты? Наверное, авторы stl ничего не умеют...

Цитата Сообщение от Kgfq Посмотреть сообщение
Если это можно сделать самому, то разрабы стл тем более могли написать
С какого перепугу им это надо было сделать? Они сделали честное округление при печати. Подрезание строки их никто делать не просил. Точно так их не просили включать в stl какую-нибудь реализацию калькулятора или табулирование функции (наверное, много студентов об этом мечтают)
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
16.10.2012, 23:07  [ТС] 19
Evg, при чем тут студенты или нет?
Не округлять число в повседневной жизни тоже бывает нужно. Ты же не округляешь цену 50000,50
до 50001
и не говоришь каждый раз "пятьдесят копеек"
так вот и тут

и, кстати, я про адекватные точности говорю
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.10.2012, 23:48 20
Если тебе нужно округлить до целого, то для этого есть специальные функции. Если тебе нужно округлить до стольких-то знаков после запятой, то такая задача не выполнима для встроенных плавающих типов (float, double, long double). О причинах сказано выше, причём не раз
0
16.10.2012, 23:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2012, 23:48
Помогаю со студенческими работами здесь

Ошибка: 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...

Cout <<endl; Что это значит? Если ничего нету в cout?
Здравствуйте ! Обьясните пожалуйста что значит cout &lt;&lt;endl; если он используется после цикла...

Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout
Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит...

Разница между fwrite, cout и cout.write
Привет. Пытаюсь вывести букву 'ф' в консоль Windows 7, используя кодировку UTF-8. Для этого...


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

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