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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
#1

Перевод long double в строку - C++

09.07.2013, 07:23. Просмотров 1626. Ответов 33
Метки нет (Все метки)

Кто мне объяснит, почему тут long double последнюю цифру дробит...
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
void ld_to_str(long double ld, char str[])
{
    double d1;
    d1 = ld;
    int j = 0, i = 0, a = 0;
    if(d1 == 0)
        str[a++] = '0';
    while(d1 >= 1)
    {
        d1 /= 10;
        j++;
    }
    while(d1 != 0)
    {
        d1 *= 10;
        i = d1;
        d1 -= i;
        if(a == j && d1 != 0)
        {
            str[a++] = ',';
            str[a++] = i + '0';
        }
        else
            str[a++] = i + '0';
    }
    str[a] = '\0';
}
Добавлено через 20 часов 2 минуты
Я имею ввиду что d1 после вычитания последней цифры приобретает вид 0,000000000000082349287349287349812734, примерно так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 07:29     Перевод long double в строку #2
Асурус, зачем Вам этот кривой велосипед? Используйте вывод в строковый поток: stringstream + <<.
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 07:55  [ТС]     Перевод long double в строку #3
Наверное вы правы, только я ещё не дошёл до этого, не знаю что это такое...
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,186
Завершенные тесты: 1
09.07.2013, 09:14     Перевод long double в строку #4
А как Вам такой метод:
C++
1
2
3
4
void ld_to_str(long double ld, char str[])
{
    sprintf(str,"%22.19Lf",ld);
}
Добавлено через 12 минут
Протестировал Ваш и вышеописанный метод в Visual Studio 2008.
Похоже, что в ней double и long double ничем не различаются.
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 10:08  [ТС]     Перевод long double в строку #5
У меня через десять нулей добавляется ещё единица почему-то...

Добавлено через 49 секунд
Цитата Сообщение от zss Посмотреть сообщение
А как Вам такой метод:
C++
1
2
3
4
void ld_to_str(long double ld, char str[])
{
    sprintf(str,"%22.19Lf",ld);
}
Добавлено через 12 минут
Протестировал Ваш и вышеописанный метод в Visual Studio 2008.
Похоже, что в ней double и long double ничем не различаются.
В этом примере.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 10:37     Перевод long double в строку #6
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <limits>
#include <string>
 
int main()
{
    long double ld = std::numeric_limits<long double>::max();
    std::string s = std::to_string(ld);
    std::cout << s << std::endl;
}
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 10:58  [ТС]     Перевод long double в строку #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <limits>
#include <string>
 
int main()
{
    long double ld = std::numeric_limits<long double>::max();
    std::string s = std::to_string(ld);
    std::cout << s << std::endl;
}
Здесь я не понимаю первую строку...

Добавлено через 1 минуту
В main(), т.е. №7

Добавлено через 5 минут
И мне нужна сторока типа char массива.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 10:59     Перевод long double в строку #8
Цитата Сообщение от Асурус Посмотреть сообщение
И мне нужна сторока типа char массива.
std::string метод c_str()
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 11:16     Перевод long double в строку #9
Асурус, первая строка с хедером #include <limits> подключает шаблон "лимитов". Фактически инициализирует переменную ld максимально возможным значением для long double. Что касательно строки в стиле С, как уже упоминалось выше, у std::string есть метод c_str(), который возвращает const char * - т.е. строку в стиле С.
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 14:31  [ТС]     Перевод long double в строку #10
xtorne21st, А как в данной ситуации присвоить определённое значение ld?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 14:38     Перевод long double в строку #11
Цитата Сообщение от Асурус Посмотреть сообщение
А как в данной ситуации присвоить определённое значение ld?
Вы не знаете как присвоить значение переменной?
zverek
2 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 22
09.07.2013, 14:40     Перевод long double в строку #12
Асурус, вводом с консоли/файла.

Для консоли:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main()
{ 
long double ld;
std::cin>>ld;
std::string s = std::to_string(ld);
std::cout << s << std::endl;
}
Для файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <fstream>
#include <string>
 
int main()
{ 
long double ld;
std::ifstream in;
std::ofstream out;
std::in.open("input.txt");
std::out.open("output.txt");
std::in>>ld;
std::string s = std::to_string(ld);
std::out << s << std::endl;
std::in.close();
std::out.close();
}
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 15:18     Перевод long double в строку #13
Цитата Сообщение от Асурус Посмотреть сообщение
xtorne21st, А как в данной ситуации присвоить определённое значение ld?
Асурус, да точно также как можно присвоить значение переменной, например типа char или int. Я понял, вас немножко запутало std::numeric_limits<long double>::max(). Вот пример с комментариями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <limits>
#include <string>
 
int main()
{
    long double tmp; // Определить место в памяти для типа long double.
    // std::numeric_limits<long double>::max() возвращает максимально возмножное значение для long double.
    tmp = std::numeric_limits<long double>::max(); // присвоить tmp максимально возможно значение для long double.
    long double ld = tmp; // определить переменную типа long double и инициализировать её значением хранящимями в tmp.
    std::string s = std::to_string(ld); // определить переменную s типа std::string и инициализировать её значением,
    // которое возвращает метод std::to_string().
    std::cout << s.c_str() << std::endl; // вывести результат в Сишном представлении :) (const char *)
}
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
10.07.2013, 02:46  [ТС]     Перевод long double в строку #14
Всё стало ясно, всем спасибо, вопрос закрыт.

Добавлено через 11 часов 23 минуты
xtorne21st, Когда я скомпилировал проект, возникла маленькая проблема... пропали последние цифры? Что надо сделать чтоб это работало? У меня VC++ 2010.
stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
 
#pragma once
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
 
#include <string>
#include <iostream>
 
#include "Long_Double_to_string.h"
using namespace std;
 
// TODO: reference additional headers your program requires here
Long_Double_to_string.h
C++
1
2
3
#include "stdafx.h"
 
void ld_to_str(long double, char*);
Long_Double_to_string.cpp
C++
1
2
3
4
5
6
7
#include "stdafx.h"
 
void ld_to_str(long double ld, char* str)
{
    string s = to_string(ld);
    strcpy(str, s.c_str());
}
Long_Double_to_string_V_3_0.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Long_Double_to_string_V_3_0.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    long double ld = 12345.12345;
    char str[100];
    ld_to_str(ld, str);
    cout << str << endl;
    system("pause");
    return 0;
}
Вот проект.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 10:37     Перевод long double в строку
Еще ссылки по теме:
Округление Long double. C++
описание long double в С C++
C++ Long float и double
long double и char C++
C++ Маленькая мантисса long double

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
10.07.2013, 10:37     Перевод long double в строку #15
у меня всё ок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <cstring>
 
using namespace std;
 
void ld_to_str(long double ld, char* str)
{
    string s = to_string(ld);
    strcpy(str, s.c_str());
}
 
int main()
{
    long double ld = 12345.12345;
    char str[100];
    ld_to_str(ld, str);
    cout << str << endl;
    return 0;
}
Вы сначала трансформируете в std::string, затем в массив чаров. Зачем так много действий. Достаточно обойтись только std::string:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
 
using namespace std;
 
std::string ld_to_str(long double ld)
{
    return to_string(ld);
}
 
int main()
{
    long double ld = 12345.12345;
    std::string string_value = ld_to_str(ld);
    cout << string_value << endl;
    return 0;
}
Оба кода выдают один и тот же результат:
Bash
1
12345.123450
Yandex
Объявления
10.07.2013, 10:37     Перевод long double в строку
Ответ Создать тему
Опции темы

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