74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408

double + cout

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

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

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

Как сделать, что бы не округляло?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2012, 15:42
Ответы с готовыми решениями:

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

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; } выводит a=0; использую 2008 студию....

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

27
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:02  [ТС]
Студворк — интернет-сервис помощи студентам
Evg, я же выполнил, значит выполнима
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
17.10.2012, 00:16
Ты не выполнил. Ты напечатал с округлением, но не округлил. То бишь получил строковое представление с округлением, но не величину, которую можно будет использовать в вычислениях. Потому что у тебя при вычислениях на машине будет лишний хвост, которого не должно быть в реальности при вычислении на бумаге

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main (void)
{
  double a =  48.7999999;
  double b = a * 10000000.0;
  std::cout << std::fixed << std::setprecision(20) << b << std::endl;
  return 0;
}
Bash
487999999.00000005960464477539
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:18  [ТС]
Evg, зачем мне вычисления. Мне нужно было лишь ВЫВЕСТИ на экран.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
17.10.2012, 01:06
Твой исходный вопрос звучал как "Как вывести число с исходной точностью, но не округляя его?" Тебе ответили, что никак. Потому что число, которое в десятичной системе пишется "48.799999999999997", в двоичной системе записывается в виде бесконечной непериодической записи. В машине представление конечное, а потому бесконечная двоичная запись обрезается и то число, что хранится в машине уже перестаёт в точности совпадать с тем, что ты написал в тексте программы. А потому в машине физически нету числа с "исходной точностью", а потому задача невыполнимая. Ты его можешь напечатать с точностью до стольких-то знаков после запятой
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 23:00  [ТС]
Evg, исходная точность cout - 6 знаков после запятой. Так что это ты не понял вопроса.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
17.10.2012, 23:59
Цитата Сообщение от Kgfq Посмотреть сообщение
исходная точность cout - 6 знаков после запятой
Это не исходная точность, а дефолтное округление, что как бэ не одно и то же

Цитата Сообщение от Kgfq Посмотреть сообщение
Так что это ты не понял вопроса
Однако упёртый ты товарищ. Возьмём следующий пример. На всякий случай сообщаю, что таким образом распечатывается байтовый образ плавающего числа, хранимого в машине.

C++
#include <iostream>
 
int main (void)
{
  double a = 48.799999999999997;
  double b = 48.799999999999998;
  
  std::cout << std::hex << *((long long*)&a) << std::endl;
  std::cout << std::hex << *((long long*)&b) << std::endl;
  
  return 0;
}
Bash
4048666666666666
4048666666666666
Как видишь, для двух как бы разных плавающих чисел мы видим один и тот же байтовый образ. Т.е. машина не различает эти два плавающих числа. Внимание, вопрос. При печати машина получает 8-байтовый образ числа. Как машина должна догадаться, нужно напечатать "48.799999999999997", "48.799999999999998" или ещё одну из миллиардов разных возможных вещественных величин, которые при переводе в машинное двоичное представление дадут один и то же набор байтов

Добавлено через 17 минут
Если всё-таки я и вправду туплю и тебя интересует ответ на вопрос:

Цитата Сообщение от Kgfq Посмотреть сообщение
Если это можно сделать самому, то разрабы стл тем более могли написать
То встречный вопрос: а почему и зачем они должны были это делать? Если поставить более гипертрофированный вопрос, то почему бы в std::cout не добавить печать, которая на основании поданной строки выделит третье слово и заменит в нём все буквы "a" на "б". Такая встроенная возможность была бы крайне удобна для студента Иванова, которому преподаватель Петров задал вопрос N5 из билета N32.
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
18.10.2012, 00:42  [ТС]
Evg, печать без округления бывает полезна. Поэтому вполне логично было бы, если бы ее добавили в стл. Ведь добавили же самые разные вещи.

Впрочем, это уже философский спор. Я понял суть.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
18.10.2012, 09:02
Цитата Сообщение от Kgfq Посмотреть сообщение
печать без округления бывает полезна
Многое что бывает полезно. В Си++ добавили в первую очередь исходя из того, что подобная функциональность (возможно, избыточная) была в Си. А избыточность функциональности printf'а в первую очередь диктовалась требованиями производительности: язык-то придумывали в те времена, когда машины были медленные, а памяти было мало

Нигде при печати ведь нету округления целых чисел, ибо к процедуре печати это не имеет никакого отношения. А вот округление плавающих чисел - это не просто дополнительная функциональность и не пижонский набор велосипедов, это просто реальная необходимость, обусловленная тем, что плавающие числа изначально представляются неточно и печать почти любого плавающего числа помимо печати "неправильного" значения будет иметь ещё и очень длинную запись. Поэтому округление при печати пришлось вводить ещё в языке Си (в printf), а затем и в Си++ (в std::cout)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2012, 09:02

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за 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)"
#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?
Здравствуйте ! Обьясните пожалуйста что значит cout &lt;&lt;endl; если он используется после цикла for?

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

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


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

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

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru