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

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

Войти
Регистрация
Восстановить пароль
 
Dvarik
0 / 0 / 0
Регистрация: 28.05.2014
Сообщений: 4
#1

Long double отображается не верно - C++

28.05.2014, 15:15. Просмотров 240. Ответов 7
Метки нет (Все метки)

суть проблемы такова:
решаю задачу где вводится некое значение long double, большое значение, которое в последствии переводится в string
так вот компилятор long double постоянно округляет, то есть если я ввожу 123456,789, то получаю 123457, вот это значение и присваивается типу string.
как можно решить данную проблему, пробовал это как на microsoft visual С++, так и на более новом microsoft visual studio, результат такой же

тут моя попытка решения(задача не закончена), может сам где-то накосячил:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//glava 7 zadacha 11
#include<iostream>
#include<windows.h>
#include<math.h>
#include<sstream>
using namespace std;
/////////////////////////////////////////////////
static const int i = 20;
/////////////////////////////////////////////////
 
class ldtoms
{
private:
    long double ld_input;
    //long double ld_output;
public:
    void do_work()
    {
        int dlina_proverka = 0;
        int index_zpt;
        while ( dlina_proverka != 1 )
        {           
            cout << "ââåäèòå âåëè÷èГ*Гі äëÿ ïåðåâîäГ* Гў äåГ*ГҐГ¦Г*ûé ôîðìГ*ГІ:  ";
            cin >> ld_input;
            printf("%f \n", ld_input);
            cout << "ld_input = " << ld_input << endl;
            if (ld_input < 100000000000000000)
            {
                dlina_proverka = 1;
            };
        };
        cout << "ïðîâåðêГ* ïðîéäåГ*Г* ГіГ±ГЇГҐГёГ*Г®" << endl;
        ostringstream oss;
        oss << ld_input << ends;
        string ustring = oss.str();
        printf("%s \n", ustring.c_str());
        cout << "ustring = " << ustring << endl;
        index_zpt = ustring.length();
        for (int i = 0; i < ustring.length(); i++)
        {
            cout << i << ' ' << ustring[i] << endl;
            if (ustring[i] == '.')
            {
                index_zpt = i;
            };
            /*else
            {
                index_zpt = ustring.length();
            };*/
        };
        cout << "index_zpt = " << index_zpt << endl;
    };
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int a;
    ldtoms money_long;
    money_long.do_work();
    return 0;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4511 / 3849 / 1295
Регистрация: 14.04.2014
Сообщений: 15,101
28.05.2014, 15:27     Long double отображается не верно #2
Насколько длинные числа ты вводишь?
У Microsoft, насколько я помню, long double и double - одно и то же.
Dvarik
0 / 0 / 0
Регистрация: 28.05.2014
Сообщений: 4
28.05.2014, 15:32  [ТС]     Long double отображается не верно #3
по условию не больше 9 999 999 999 999 999,00
nmcf
4511 / 3849 / 1295
Регистрация: 14.04.2014
Сообщений: 15,101
28.05.2014, 15:48     Long double отображается не верно #4
У double 15-16 значащих цифр. Всё остальное будет округляться.
Dvarik
0 / 0 / 0
Регистрация: 28.05.2014
Сообщений: 4
28.05.2014, 15:50  [ТС]     Long double отображается не верно #5
почему же тогда 123456,789 округляется до 123457?
причем через printf отображается верно, а присваивает урезанный вариант
nmcf
4511 / 3849 / 1295
Регистрация: 14.04.2014
Сообщений: 15,101
28.05.2014, 16:29     Long double отображается не верно #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавь
C++
1
#include<iomanip>
34-ю строку сделай так:
C++
1
        oss << setprecision(15) << ld_input << ends;
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.05.2014, 16:30     Long double отображается не верно #7
А если так переводить?
C++
1
2
3
4
5
6
7
8
int main()
{
   long double val = 123456.789;
   std::string str = std::to_string(val);
   std::cout << str << "\n";
 
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 16:41     Long double отображается не верно
Еще ссылки по теме:

long double и char C++
C++ Перевод long double в строку
C++ Вывести long double число без перевода в double
Long double и Borland 3.1 C++
C++ Long float и double

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

Или воспользуйтесь поиском по форуму:
Dvarik
0 / 0 / 0
Регистрация: 28.05.2014
Сообщений: 4
28.05.2014, 16:41  [ТС]     Long double отображается не верно #8
to DiffEreD
по условию нужно преобразовать используя ostrstream (то что ostrstream и ostringstream не одно и тоже в курсе, но ostrstream компилятор ни в какую не принимает)

to nmcf
помогло, спасибо огромное
Yandex
Объявления
28.05.2014, 16:41     Long double отображается не верно
Ответ Создать тему
Опции темы

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