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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 07:23     Перевод long double в строку #1
Кто мне объяснит, почему тут 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Модератор
Эксперт С++
 Аватар для zss
5954 / 5559 / 1788
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 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
интересующийся
300 / 271 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.07.2013, 10:59     Перевод long double в строку #8
Цитата Сообщение от Асурус Посмотреть сообщение
И мне нужна сторока типа char массива.
std::string метод c_str()
xtorne21st
интересующийся
300 / 271 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
интересующийся
300 / 271 / 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;
}
Вот проект.
xtorne21st
интересующийся
300 / 271 / 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
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.07.2013, 10:43     Перевод long double в строку #16
xtorne21st,
Цитата Сообщение от xtorne21st Посмотреть сообщение
Зачем так много действий. Достаточно обойтись только std::string:
тогда уж и ld_to_str тоже упразднить:
C++
1
std::string string_value = to_string(ld);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2013, 10:53     Перевод long double в строку #17
Цитата Сообщение от xtorne21st Посмотреть сообщение
у меня всё ок:
В студии?
Цитата Сообщение от Асурус Посмотреть сообщение
У меня VC++ 2010.
Croessmah
10.07.2013, 10:55
  #18

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
В студии?
У меня это MinGW так же норм скомпилил

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2013, 10:57     Перевод long double в строку #19
Цитата Сообщение от Croessmah Посмотреть сообщение
У меня это MinGW так же норм скомпилил
mingv нормально, а в студии to_string() обрезает до 6 знаков.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 11:01     Перевод long double в строку
Еще ссылки по теме:

C++ Вывести long double число без перевода в double
Перевод из String в long long C++
Почему перестает работать программа при замене double на long double? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.07.2013, 11:01     Перевод long double в строку #20
Цитата Сообщение от alsav22 Посмотреть сообщение
mingv нормально, а в студии to_string() обрезает до 6 знаков.
и MinGW тоже обрезает. Просто, наверное, построен на stringstream и берет стандартный precision + fixed
Yandex
Объявления
10.07.2013, 11:01     Перевод long double в строку
Ответ Создать тему
Опции темы

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