74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
||||||
1 | ||||||
double + cout14.10.2012, 15:42. Показов 18625. Ответов 27
Метки нет (Все метки)
Через cout вывожу double.
Как сделать, что бы не округляло?
0
|
14.10.2012, 15:42 | |
Ответы с готовыми решениями:
27
cout (double) double a=1/2; cout<<a;(a=0) что не так? Неправильно работает cout для чисел типа double и float Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double |
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
|
||||||
14.10.2012, 15:49 | 2 | |||||
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
14.10.2012, 15:49 | 3 |
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 | |||||
Я не понял, в чём проблема?
0
|
14.10.2012, 16:54 | 10 |
Никак. Потому что данное число изначально нельзя представить точно в двоичном виде. Если, к примеру, взять число 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
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
15.10.2012, 15:55 [ТС] | 15 |
Evg, о выводе БЕЗ округления вовсе
0
|
15.10.2012, 16:11 | 16 |
Без округления это число будет выглядеть как бесконечная последовательность. Просто разработчики stl знают о том, как в машине хранятся плавающие числа, а ты - нет. Потому они понимают невозможность решения задачи в такой постановке, а ты - нет
Возьми пример из поста #20 и вместо 20 подставь 50, 100, 200 и т.д. Может после этого ты начнёшь всё-таки понимать, о чём тебе тут говорят. Если нет, тогда либо забей на этот вопрос, либо сядь и конкретно разберись с представлением плавающих чисел на машине. Потому что без этого ты никогда не поймёшь бредовость своей постановки задачи
0
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
||||||
15.10.2012, 16:48 [ТС] | 17 | |||||
Evg,
Если это можно сделать самому, то разрабы стл тем более могли написать. Добавлено через 1 минуту Кстати, выведет 48.79999
0
|
15.10.2012, 19:47 | 18 |
Господи, ну почему же ты не читаешь, что тебе пишут? В 8-й строке замени "20" на "30", а в 33-й - "5" на "30". И почему же в итоге число-то такое кривое выводится, совсем не такое, какое писал ты? Наверное, авторы stl ничего не умеют...
С какого перепугу им это надо было сделать? Они сделали честное округление при печати. Подрезание строки их никто делать не просил. Точно так их не просили включать в stl какую-нибудь реализацию калькулятора или табулирование функции (наверное, много студентов об этом мечтают)
0
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
16.10.2012, 23:07 [ТС] | 19 |
Evg, при чем тут студенты или нет?
Не округлять число в повседневной жизни тоже бывает нужно. Ты же не округляешь цену 50000,50 до 50001 и не говоришь каждый раз "пятьдесят копеек" так вот и тут и, кстати, я про адекватные точности говорю
0
|
16.10.2012, 23:48 | 20 |
Если тебе нужно округлить до целого, то для этого есть специальные функции. Если тебе нужно округлить до стольких-то знаков после запятой, то такая задача не выполнима для встроенных плавающих типов (float, double, long double). О причинах сказано выше, причём не раз
0
|
16.10.2012, 23:48 | |
16.10.2012, 23:48 | |
Помогаю со студенческими работами здесь
20
Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" Cout <<endl; Что это значит? Если ничего нету в cout? Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout Разница между fwrite, cout и cout.write Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |