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

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

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

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

09.07.2013, 07:23. Просмотров 1666. Ответов 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, примерно так.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2013, 07:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод long double в строку (C++):

Перевод из double в long - C++
Можно ли как-то перевести число double в 2 числа long так, чтобы одно число было его целой частью, а другое дробной?

Перевод long double в string - C++
Дана задача http://www.cyberforum.ru/attachment.php?attachmentid=97778&stc=1&d=1317238135 Я не понимаю как конвертировать...

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

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

Вывести long double число без перевода в double - C++
Надо вывести long double число без перевода в double. Пишу: printf("%Lf",S); и выводится неверно. Компилятор -- MinGW, та же фишка на...

Double, int , long double - C++
Как вычислить диапазоны типов вручную указанных в название темы?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 07:29 #2
Асурус, зачем Вам этот кривой велосипед? Используйте вывод в строковый поток: stringstream + <<.
0
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 07:55  [ТС] #3
Наверное вы правы, только я ещё не дошёл до этого, не знаю что это такое...
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
09.07.2013, 09:14 #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 ничем не различаются.
0
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 10:08  [ТС] #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 ничем не различаются.
В этом примере.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 10:37 #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;
}
1
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 10:58  [ТС] #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 массива.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 10:59 #8
Цитата Сообщение от Асурус Посмотреть сообщение
И мне нужна сторока типа char массива.
std::string метод c_str()
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 11:16 #9
Асурус, первая строка с хедером #include <limits> подключает шаблон "лимитов". Фактически инициализирует переменную ld максимально возможным значением для long double. Что касательно строки в стиле С, как уже упоминалось выше, у std::string есть метод c_str(), который возвращает const char * - т.е. строку в стиле С.
1
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 14:31  [ТС] #10
xtorne21st, А как в данной ситуации присвоить определённое значение ld?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.07.2013, 14:38 #11
Цитата Сообщение от Асурус Посмотреть сообщение
А как в данной ситуации присвоить определённое значение ld?
Вы не знаете как присвоить значение переменной?
0
zverek
2 / 1 / 0
Регистрация: 18.04.2012
Сообщений: 22
09.07.2013, 14:40 #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();
}
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.07.2013, 15:18 #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 *)
}
1
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
10.07.2013, 02:46  [ТС] #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;
}
Вот проект.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
10.07.2013, 10:37 #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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 10:37
Привет! Вот еще темы с ответами:

Перевод из String в long long - C++
Мне нужна функция для перевода из String в long long.Функция atoi(const char* str) работает только с констатным масивом символов а мне...

Написать функцию для перевода переменной типа long в символьную строку в шестнадцатиричном представлении ( ltoah( long num, char s[]) ) и тестирующую - C++
Написать функцию для перевода переменной типа long в символьную строку в шестнадцатиричном представлении ( ltoah( long num, char s) ) и...

Long Double - C++
Разве нет типа более емкого, чем Double в Visual studio? Long Double, как я понял, определяется как обычный Double. А мне нужен аналог по...

long double и char - C++
Товарищи, помогите чайнику разобраться в данном теоретическом вопросе: long double* m=95; m--; m=? char* t=2; t-=4; t=?


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

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

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