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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.62
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

double + cout - C++

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

Через cout вывожу double.

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

Как сделать, что бы не округляло?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 15:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос double + cout (C++):

cout (double) - C++
Всем привет! Подскажите плз как вывести число типа дабл при помощи cout так чтобы были видны столько знаков, сколько я захочу а не 6...

double a=1/2; cout<<a;(a=0) что не так? - C++
#include &lt;iostream&gt; using namespace std; void main() { double a=1/2; cout&lt;&lt;a; } выводит a=0; использую 2008 студию....

Неправильно работает cout для чисел типа double и float - C++
Здравствуйте. Скажите, почему эта программа выводит на экран число 2, а не 2.5 ? #include &lt;iostream.h&gt; int main() { double...

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

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

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

27
doctor_lecter
281 / 154 / 8
Регистрация: 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
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 15:49 #3
http://www.cplusplus.com/reference/iostream/ios_base/precision/
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:03  [ТС] #4
С помощью точности я и так могу. Мне нужно с исходной точностью, но что бы не округляло

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

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

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

Вот с такой точностью? Меньшей? Большей?
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:17  [ТС] #8
~OhMyGodSoLong~, с той точностью, которая сейчас установлена в cout с помощью функции setprecision. Неужели в cout нету ни одного флага, отвечающего за округление?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 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
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,262
Записей в блоге: 30
14.10.2012, 16:54 #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Как вывести число с исходной точностью
Никак. Потому что данное число изначально нельзя представить точно в двоичном виде. Если, к примеру, взять число 1/3, то ты его в принципе не сможешь напечатать точно в десятичной системе счисления. В зависимости от количество печатаемых знаков можно напечатать как "0.3", "0.33", "0.333" и т.д. Но ты никогда его точно не напечатаешь. В твоей исходной задаче проблема та же самая: ты пишешь в программе число в десятичном виде, а оно не может быть точно переведено в двоичный вид (потому что машина хранит данные в двоичном виде), а следовательно, не может быть в дальнейшем точно напечатано
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 17:23  [ТС] #11
Evg, а если я хочу, что бы вывело 48.799999 и все?
ведь можно просто "обрезать" конец?

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

Цитата Сообщение от Kgfq Посмотреть сообщение
Странно, что разработчики STL не подумали об этом...
О чём? О неправильном округлении?
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.10.2012, 15:55  [ТС] #15
Evg, о выводе БЕЗ округления вовсе
0
15.10.2012, 15:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 15:55
Привет! Вот еще темы с ответами:

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

В чем разница std::cout и просто cout? - C++
Ребят ,подскажите на простом языке для чайников . В чем разница std::cout и просто cout?

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

cout.setf и cout.precision - C++
Здравствуйте. В одной книге увидел строчку кода: cout.precision(2); cout.setf(ios::fixed, ios::floatfield); Объясните, что...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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