Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование double в строку


Автор: Нитонисе 5.1.2013, 16:37
Вроде вопрос простой, но что-то не найду простого решения.
Есть числа double в диапазоне 0.1-0.0000000001. Нужно эти числа в таком формате и представлять текстом. Функция FloatToStrF с режимом ffGeneral не показывает числа длиннее 0.0001. Если после запятой более трех нулей, то число преобразуется в строку вида 1E-7. 

Автор: NoviceF 5.1.2013, 17:06
Такой вариант решает вопрос?

Код

#include <iostream>
#include <algorithm>
#include <sstream>
#include <iomanip>

using namespace std;

int main()
{
   double d = 0.0000000001;
   
   stringstream ss;
   
   ss.flags(std::ios::fixed);
   ss << std::setprecision(10) << d;
   
   cout << ss.str() << endl;
}

Автор: Нитонисе 5.1.2013, 17:16
Цитата(NoviceF @  5.1.2013,  17:06 Найти цитируемый пост)
Такой вариант решает вопрос?

Я работаю в RAD Studio Builder XE и там вывести текстовую величину в формате std::string я не знаю как, чтобы проверить. Надо бы получить строку в UnicodeString. 

Замечу, что точность double может быть любая и может образовываться мусор. Например число 0.00001 может храниться в памяти как 0.000010000000002. Вот надо этот мусор отсекать и представлять число только до единички.

Автор: NoviceF 5.1.2013, 17:30
По быдлеру ничего не могу сказать smile
Цитата(Нитонисе @  5.1.2013,  18:16 Найти цитируемый пост)
точность double может быть любая и может образовываться мусор

как вариант можно умножать на 10, пока число не станет >1, тогда будет ясно, какаю точность нужно использовать для отсечения.. но это так.. мысли на тему.. скорее всего существует гораздо более элегантное решение smile

Автор: mes 5.1.2013, 17:41
Цитата(Нитонисе @  5.1.2013,  16:16 Найти цитируемый пост)
 Вот надо этот мусор отсекать и представлять число только до единички. 

для этого надо сформулировать правило определяющее, что есть для Вас мусор..

Добавлено через 1 минуту и 38 секунд
Цитата(Нитонисе @  5.1.2013,  16:16 Найти цитируемый пост)
Надо бы получить строку в UnicodeString. 

так гляньте в доку как конвертировать си-строки в билдеровские..

Автор: Нитонисе 5.1.2013, 17:59
Цитата(mes @  5.1.2013,  17:41 Найти цитируемый пост)
для этого надо сформулировать правило определяющее, что есть для Вас мусор..

Мусор - это все что после первой значащей единицы.

Цитата(mes @  5.1.2013,  17:41 Найти цитируемый пост)
так гляньте в доку как конвертировать си-строки в билдеровские..

Да я пока найду сам - тут могут быстрее подсказать. Ведь это просто, когда знаешь.

Автор: Dem_max 5.1.2013, 18:02
наверное как то так
Код

    double dd = 0.00000003535;
    UnicodeString ustr = FloatToStrF(dd, ffNumber, 15, 15);
    Label1->Caption = ustr;

Автор: Нитонисе 5.1.2013, 18:20
Цитата(Dem_max @  5.1.2013,  18:02 Найти цитируемый пост)
наверное как то так

Нет. Тут любое число представлено 15-ю разядами. То есть 0.001 будет представлено как 0.00100000000000.

Поясню еще одну вещь. Число всегда равно единице, только у нее порядок может быть разный. Например 1E+3 или 1E-3. Нужно эти числа записывать в обычном виде - 1000 и 0.001.

Автор: feodorv 5.1.2013, 18:44
Цитата(Нитонисе @  5.1.2013,  19:20 Найти цитируемый пост)
Число всегда равно единице, только у нее порядок может быть разный. 

Дурацкий совет, наверное, но стОит тогда хранить порядок отдельно, для 1000 - это будет 3, для 0.001 - соответственно, -3. Параллельно можно содержать само число в когерентном состоянии...

Автор: mes 5.1.2013, 19:10
Цитата(Нитонисе @  5.1.2013,  16:59 Найти цитируемый пост)
Мусор - это все что после первой значащей единицы.

Цитата(Нитонисе @  5.1.2013,  17:20 Найти цитируемый пост)
 Число всегда равно единице, только у нее порядок может быть разный. 

тогда зачем тут double ? чтоб жизнь медом не казалась? smile

Цитата(Нитонисе @  5.1.2013,  16:59 Найти цитируемый пост)
Да я пока найду сам - тут могут быстрее подсказать. Ведь это просто, когда знаешь. 

насколько я знаю, тут любят подсказывать тем, кто сам пытается найти.. плюс те кто билдер любят, они в других отделах развлекаются... smile

Автор: Нитонисе 5.1.2013, 20:02
Цитата(mes @  5.1.2013,  19:10 Найти цитируемый пост)
тогда зачем тут double ? чтоб жизнь медом не казалась?

Затем что так проще. Не буду вдаваться в подробности, потому как это уже вне топика. Как я вижу - простого решения по представлению double строкой (с учетом моих требований к этой конвертации) нет?

Цитата(mes @  5.1.2013,  19:10 Найти цитируемый пост)
насколько я знаю, тут любят подсказывать тем, кто сам пытается найти.. плюс те кто билдер любят, они в других отделах развлекаются... 

А я считаю, что глупо тратить время на то, что тебе могут подсказать гораздо быстрее. Это неэффективно. И странно слышать подобное на форуме программистов - людей, которые занимаются экономией времени, выполняя некоторые рутинные (и не только) действия в автоматическом режиме. 
Форумы на то и существуют, чтобы делиться информацией. Вы мне что-то подскажите, сэкономив время, я - вам. Взаимовыгодное общение. Только не надо говорить, что моя помощь вам как программисту не требуется. В это я охотно верю, поскольку не являюсь профессиональным программистом smile Но ведь и вы в каких-то областях непрофессионал. Как знать, может быть задавая вопросы на непрофильных для вас форумах, но профильных для меня, - уже я вам окажу помощь smile

Автор: feodorv 5.1.2013, 20:09
Цитата(Нитонисе @  5.1.2013,  21:02 Найти цитируемый пост)
Как я вижу - простого решения по представлению double строкой (с учетом моих требований к этой конвертации) нет?

Вы услышали?
Цитата(feodorv @  5.1.2013,  19:44 Найти цитируемый пост)
наверное, но стОит тогда хранить порядок отдельно, для 1000 - это будет 3, для 0.001 - соответственно, -3. Параллельно можно содержать само число в когерентном состоянии... 


Автор: Нитонисе 5.1.2013, 20:27
feodorv, да, видел конечно. Просто это сложный путь. У меня это число в формате double и мне удобно что бы в этом формате оно и было. Вся проблема только в его текстовом представлении. Я думал что есть что-то простое наподобие FloatToStrF. Но если нету, тогда придется мудрить. И идея представления числа в виде простого int'а обозначающего степень - не плоха.

Автор: mes 5.1.2013, 20:46
Цитата(Нитонисе @  5.1.2013,  19:02 Найти цитируемый пост)
А я считаю, что глупо тратить время на то, что тебе могут подсказать гораздо быстрее. 

вот только вы одного не учитываете.. о том, что доки пересказывать неполезно для обоих, как для рассказчика, который тратит время и может не учесть нюансов, так и для спрашивающего, который получает неполную информацию, заставляющая в последствии опять же задавать вопрос подобного уровня.. 
где там доки по билдерским типам я не знаю, но если б подобное касалось бы стд, получили бы ссылку на доку.. 

Цитата(Нитонисе @  5.1.2013,  19:02 Найти цитируемый пост)
 Взаимовыгодное общение.

все то оно так, за мелким исключением.. вот выгодно ли Вам загружать себя информацией от третьих лиц, которую еще и перепроверять нужно..
одно дело когда вы спрашиваете о методах и подходах, тут конечно лучше спросить, если гугль не находит.. 
А вот о том какими конструкторами или методами обладает документированный класс, спрашивать далеко не выгодно для Вас же самих.. 

Автор: Нитонисе 5.1.2013, 20:54
Цитата(mes @  5.1.2013,  20:46 Найти цитируемый пост)
вот только вы одного не учитываете

Я понимаю, что исчерпывающий ответ можно и не получить, если это займет много времени отвечающего smile Но как знать, вдруг ответ на мой вопрос прост. В этом случае тратить кучу времени на самостоятельный поиск решения - это неэффективно. Гораздо эффективнее воспользоваться подсказкой знающих людей, если для них это не трудно и не жалко smile

Автор: mes 5.1.2013, 20:59
Цитата(Нитонисе @  5.1.2013,  19:54, пост2540424)
. Гораздо эффективнее воспользоваться подсказкой знающих людей, если для них это не трудно и не жалко

так доку от билдера не знаю, то "переформулиров" Ваш вопрос на стд : "как из си-строки получить - стд-строку? " 
наиболее полным и точным был бы такой : 
см. http://www.cplusplus.com/reference/string/string/string/

а стоит ли из за такого ответа спрашивать ?  smile 

Автор: feodorv 5.1.2013, 22:02
Цитата(Нитонисе @  5.1.2013,  21:27 Найти цитируемый пост)
Просто это сложный путь.

Чем же?  smile 

Нужно double, пожалуйста:
Код

pow( 10, power)


Нужна строка, пожалуйста:
Код

if( power >= 0 )
{
  str = "1";
  for( int i = 0; i < power; i++) str += "0";
}
else
{
  int n = -power-1;
  str = "0.";
  for( int i = 0; i < n; i++) str += "0";
  str += "1";
}

Автор: volatile 6.1.2013, 00:47
Как вариан можно просто прецижн высчитывать пропорционально порядку числа.
http://codepad.org/msYJWdID


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)