Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 2
1

При выводе числа с плавающей запятой теряются последние цифры

30.10.2014, 05:21. Показов 4879. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Мне дано число 0,1025390625. double отрезает конец и выводит 0.102539. Как мне сохранить это число целиком и оперировать с ним? Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 05:21
Ответы с готовыми решениями:

При вводе в textbox числа с плавающей запятой выбивает ошибку
когда ввожу в textbox("расход"или "доллар") число с плав.запятой выбивает ошибку. Помогите плз,...

Как поменять разделитель при выводе вещественного числа в TextBox с запятой на точку?
Как поменять разделитель при выводе вещественного числа в TextBox с запятой на точку?

Как убрать последние две цифры после запятой?
Как убрать последние две цифры после запятой? остаток от деления? на с++

Числа с плавающей запятой
Всем привет! как сравнивать числа с плавающей запятой? var c : real; begin c := 0; if...

3
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
30.10.2014, 05:48 2
Во-первых, double так резко не отрезает. Скорее всего вы просто используете недостаточную точность при выводе числа на печать. Запросите повыше точность при выводе.

Во-вторых, представить ваше число точно все равно не выйдет. В общем случае конечные десятичные дроби переводятся в бесконечные двоичные дроби. Поэтому при использовании двоичных плавающих форматов с этим придётся мириться. Если точность double (или long double) окажется для вас недостаточной, то придётся изобретать что-то принципиально иное.
0
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 2
30.10.2014, 05:58  [ТС] 3
1.cout << chislo << std::numeric_limits<double>::digits10; //или cout << chislo << std::numeric_limits<double>::max();
Таким образом?
2.long double у меня то же самое, что и double. Да, мне точности недостаточно. Кроме иного ничего доступного нет?
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
30.10.2014, 06:22 4
Лучший ответ Сообщение было отмечено akelling как решение

Решение

Цитата Сообщение от akelling Посмотреть сообщение
1.cout << chislo << std::numeric_limits<double>::digits10; //или cout << chislo << std::numeric_limits<double>::max();
Таким образом?
Нет, вот таким

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
  double d = 0.1025390625;
  cout << d << endl;
  cout << setprecision(10) << d << endl;
  return 0;
}
Вывод

0.102539
0.1025390625

Цитата Сообщение от akelling Посмотреть сообщение
2.long double у меня то же самое, что и double. Да, мне точности недостаточно. Кроме иного ничего доступного нет?
Еще раз: отрезание выполняет не double или long double, а именно функция вывода текста на печать. Внутренне в double и long double хранится существенно более высокая точность. Вам надо лишь попросить функцию вывода не "глушить" эту точность.

Но опять же, внутренне double хранит ваше число не абсолютно точно. Но попросив вывод с 10 знаками после запятой вы тем самым запрашиваете соответствующее округление и оно "восстанавливает" ваше исходное число. Пока вы не упретесь в пределы возможностей double, такое округление будет правильно восстанавливать ваше исходное число.

Я беру свои слова обратно. Число 0.1025390625 представимо точно в виде суммы степеней двойки. 0.102539062510 = 0.00011010012. Это значит, что это одно из тех "редких" чисел, которые представимы абсолютно точно в двоичном плавающем формате. Причем даже float достаточно, чтобы представить его точно.
1
30.10.2014, 06:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 06:22
Помогаю со студенческими работами здесь

Числа с плавающей запятой
как сделать чтобы при выполнении этой программы, выводилось не &quot;3e-05&quot; ,а &quot;0.00003&quot; a = 3 /...

Числа с плавающей запятой
есть программа которая подсчитывает сумму чисел, введенных с командной строки. к примеру С:\&gt;...

Числа с плавающей запятой
Доброго времени суток форуманчане! Сижу над книгой Хорстмана и непонятен момент с дробными числами...

При переводе из double в string теряются знаки после запятой
Перевожу переменную double в string stringstream sst; string f_str; double f=12345.99; sst...


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

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