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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
#1

Почему при преобразования из float в double коверкается число? - C++

23.06.2012, 21:03. Просмотров 1443. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
    float fll=34.23; cout << "  fll="<< fll; //Вот тут я ввожу 
    double dub;
    dub = (double)fll;cout<<"  dub="<<dub; // А вот тут оно уже : 34.229999542331292 почему так??
 
    char ss[]="9 10 /5 2  ";
    char dd[20];
 
    gcvt(dub,10,dd);
    strcat(ss,dd);
 
    cout << "  ss=" << ss;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему при преобразования из float в double коверкается число? (C++):

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Почему точность Double такая же как у Float ? - C++
Вначале столкнулся с проблемой float: time=65536.0f; (можно и больше число указать) time+=0.003; Тут time не меняетя! Оно меняется,...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

Как проверить вводилось ли число (типа double или float) в консоль - C++
Как проверить вводилось ли число (типа double или float) в консоль?

Объясните ситуацию с integer, float и double. Выводится число на единицу меньше положенного - C++
Здравствуйте. Хотел бы разузнать, в чем дело в следующей ситуации: void excs_fifteen() { system(&quot;cls&quot;); cout&lt;&lt;&quot;-&gt;...

Разные результаты при расчетах с float и double - C++
Здравствуйте! Почему при расчете с float и double получаю разные результаты? #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
23.06.2012, 21:14 #2
zinjvi, ну приблизительно оно равно тому что ты ввел) В чем проблема?) На Луну тебе лететь не надо, так что порядок)
0
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
23.06.2012, 21:26  [ТС] #3
Цитата Сообщение от Invader_Zim Посмотреть сообщение
zinjvi, ну приблизительно оно равно тому что ты ввел) В чем проблема?) На Луну тебе лететь не надо, так что порядок)
Спасибо) Но может можно избежать такого? если можно то как??
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
23.06.2012, 21:35 #4
zinjvi, можно отрезать хвост у числа)
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
23.06.2012, 21:47 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
using namespace std;
//--------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
float f=34.23;
cout<<setprecision(10)<<f<<endl;
 
system("pause");
return 0;
}
//--------------------------------------
Вывод:
Код
Текущая кодовая страница: 1251
34.22999954
Для продолжения нажмите любую клавишу . . .
У float и double точность "плавает".
1
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
23.06.2012, 22:52  [ТС] #6
Avazart, а есть ли такая функция которая бы задавала количество знаков после запятой? не точность всего числа....
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
23.06.2012, 22:59 #7
S=floor(1000*S)/1000;
и обрежет тебе до тысячных)
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
23.06.2012, 23:58 #8
Цитата Сообщение от zinjvi Посмотреть сообщение
Avazart, а есть ли такая функция которая бы задавала количество знаков после запятой? не точность всего числа....
Имеешь ввиду для вывода на экран?

Цитата Сообщение от Invader_Zim Посмотреть сообщение
S=floor(1000*S)/1000;
и обрежет тебе до тысячных)
C++
1
2
3
4
5
6
7
8
9
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
float f=34.23;
f=floor(1000*f)/1000;
cout<<setprecision(10)<<f<<endl;
system("pause");
return 0;
}
Вывод:
Код
Текущая кодовая страница: 1251
34.22999954
Для продолжения нажмите любую клавишу . . .
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,928
24.06.2012, 00:03 #9
Цитата Сообщение от zinjvi Посмотреть сообщение
Avazart, а есть ли такая функция которая бы задавала количество знаков после запятой? не точность всего числа....
Надо добавить std::fixed
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
 
int main()
{
    float pi = 3.14159265;
    std::cout<< std::setprecision(4) <<pi <<std::endl
             << std::fixed<< pi<< std::endl;
    return 0;
}
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
24.06.2012, 00:13 #10
zinjvi, К стати ваш код у меня дает другой результат:
Код
Текущая кодовая страница: 1251
  fll=34.23  dub=34.23  ss=9 10 /5 2  34.22999954
Для продолжения нажмите любую клавишу . . .
0
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
24.06.2012, 12:29  [ТС] #11
Avazart, Нет, при добавлении в строку. мне на экран это выводить не нужно. я хочу из отдельных значений типа флоат сформировать строку, а затем ее вставить с файл. (сразу почему я не вывожу в файл цифры? потому что мне нужно знать сколько знаков я вывожу. и когда количество знаков превышает 80, необходимо выводить в новую строку файла....)

может есть какие-то другие, альтернативные варианты решения этой задачи....

еще вот:
Добавлено через 3 минуты
C++
1
2
    float v=59.53; // смотрю значение переменной при отладке v=59.529999
    cout << v;  // А в консоль вывело 59.53. почему так?
Добавлено через 3 минуты
MrGluck, А можно как-то использовать std::setprecision() и std::fixed при преобразовании числа в строку?
0
Evg
Эксперт CАвтор FAQ
17812 / 6022 / 388
Регистрация: 30.03.2009
Сообщений: 16,545
Записей в блоге: 26
24.06.2012, 13:27 #12
Плавающие числа в машине изначально представляются неточно. Это связано с тем, что в машине числа хранятся в двоичном представлении, а потому числа типа 52.3 нельзя представить точно. Если ты попробуешь записать это число в двоичной форме, то получишь бесконечный ряд (по типу того, как ты в десятичной форме получишь бесконечный ряд для числа 1/7).

При печати плавающих чисел происходит округление. Для печати float'а и double'а округление происходит до различного количества знаков после запятой. К тому же у float'а дробная часть в представлении короче, чем у double'а. И это даёт такие эффекты. И та же самая причина того, что в отладчике и в консоли ты видишь разные результаты - различные настройки режима округления при печати

Если тебе нужно преобразовать плавающее число в строку со стольки-то значащими цифрами после запятой, то в Си этому соответствует функция sprintf (которая работает симметрично printf'у, но печатает в строковой буфер, а не на экран). Как пользоваться, можно посмотреть тут и тут. В Си++ при печати на экран это точно настраивается (смотреть тут), но есть ли симметричные действия для формирования строки, я не знаю
1
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
24.06.2012, 14:29 #13
MrGluck, А можно как-то использовать std::setprecision() и std::fixed при преобразовании числа в строку
Можно еще использовать stringstream, выводить в него строки с помощью этих манипуляторов.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 14:29
Привет! Вот еще темы с ответами:

Вычислить значение выражения при различных вещественных типах данных (float и double) - C++
Решите пожалуйста =* Вычислить значение выражения при различных вещественных типах данных (float и double). Вычисления следует выполнять...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

Неверный результат при преобразования типов данных static_cast<int>(double) - C++
Доброго времени суток, уважаемые программисты! Перейду сразу к сути проблемы: При данном значении вещественной переменной n (n=0.13) в...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.06.2012, 14:29
Ответ Создать тему
Опции темы

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