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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
23.06.2012, 21:03     Почему при преобразования из float в double коверкается число? #1
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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 21:03     Почему при преобразования из float в double коверкается число?
Посмотрите здесь:

cannot convert `float' to `float*. Почему так происходит? C++
Почему точность Double такая же как у Float ? C++
Объясните ситуацию с integer, float и double. Выводится число на единицу меньше положенного C++
C++ Вычислить значение выражения при различных вещественных типах данных (float и double)
C++ Как проверить вводилось ли число (типа double или float) в консоль
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
23.06.2012, 21:14     Почему при преобразования из float в double коверкается число? #2
zinjvi, ну приблизительно оно равно тому что ты ввел) В чем проблема?) На Луну тебе лететь не надо, так что порядок)
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
23.06.2012, 21:26  [ТС]     Почему при преобразования из float в double коверкается число? #3
Цитата Сообщение от Invader_Zim Посмотреть сообщение
zinjvi, ну приблизительно оно равно тому что ты ввел) В чем проблема?) На Луну тебе лететь не надо, так что порядок)
Спасибо) Но может можно избежать такого? если можно то как??
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
23.06.2012, 21:35     Почему при преобразования из float в double коверкается число? #4
zinjvi, можно отрезать хвост у числа)
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
23.06.2012, 21:47     Почему при преобразования из float в double коверкается число? #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 точность "плавает".
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
23.06.2012, 22:52  [ТС]     Почему при преобразования из float в double коверкается число? #6
Avazart, а есть ли такая функция которая бы задавала количество знаков после запятой? не точность всего числа....
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
23.06.2012, 22:59     Почему при преобразования из float в double коверкается число? #7
S=floor(1000*S)/1000;
и обрежет тебе до тысячных)
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
23.06.2012, 23:58     Почему при преобразования из float в double коверкается число? #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
Для продолжения нажмите любую клавишу . . .
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
24.06.2012, 00:03     Почему при преобразования из float в double коверкается число? #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;
}
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
24.06.2012, 00:13     Почему при преобразования из float в double коверкается число? #10
zinjvi, К стати ваш код у меня дает другой результат:
Код
Текущая кодовая страница: 1251
  fll=34.23  dub=34.23  ss=9 10 /5 2  34.22999954
Для продолжения нажмите любую клавишу . . .
zinjvi
1 / 1 / 0
Регистрация: 12.05.2012
Сообщений: 26
24.06.2012, 12:29  [ТС]     Почему при преобразования из float в double коверкается число? #11
Avazart, Нет, при добавлении в строку. мне на экран это выводить не нужно. я хочу из отдельных значений типа флоат сформировать строку, а затем ее вставить с файл. (сразу почему я не вывожу в файл цифры? потому что мне нужно знать сколько знаков я вывожу. и когда количество знаков превышает 80, необходимо выводить в новую строку файла....)

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

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

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

Если тебе нужно преобразовать плавающее число в строку со стольки-то значащими цифрами после запятой, то в Си этому соответствует функция sprintf (которая работает симметрично printf'у, но печатает в строковой буфер, а не на экран). Как пользоваться, можно посмотреть тут и тут. В Си++ при печати на экран это точно настраивается (смотреть тут), но есть ли симметричные действия для формирования строки, я не знаю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 14:29     Почему при преобразования из float в double коверкается число?
Еще ссылки по теме:

C++ Неверный результат при преобразования типов данных static_cast<int>(double)
C++ Чем отличаются float преобразования (float)var от float(var)
Почему перестает работать программа при замене double на long double? C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
24.06.2012, 14:29     Почему при преобразования из float в double коверкается число? #13
MrGluck, А можно как-то использовать std::setprecision() и std::fixed при преобразовании числа в строку
Можно еще использовать stringstream, выводить в него строки с помощью этих манипуляторов.
Yandex
Объявления
24.06.2012, 14:29     Почему при преобразования из float в double коверкается число?
Ответ Создать тему
Опции темы

Текущее время: 09:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru