Как перевести double в string c
Перейти к содержимому

Как перевести double в string c

  • автор:

Как конвертировать float/double в строку именно в том виде, в котором значение устновленно в переменной (без обрезки занков)?

Выводит «0.01234567», а надо «0.012345678900000». stringstream пробовал — результат тот же. std::to_string вообще 6 знаков пишет после точки. Точность заранее не известна, нужно выгружать в строку то, что есть, можно без нулей в конце. Как это сделать?

Отслеживать
задан 8 мая 2020 в 18:27
2,273 1 1 золотой знак 16 16 серебряных знаков 27 27 бронзовых знаков
А вы не задумывались, какова точность представления числа типом float ?
8 мая 2020 в 18:29
@Harry с double картина не меняется
8 мая 2020 в 18:31
Ну, вы вообще бредом занимаетесь — в пустой string что-то писать.
8 мая 2020 в 18:35

Ну, конкретное количество нулей справа — это вы никак не получите. У гугла есть библиотека, которая печататет числа с плавающей точкой за минимальное количество знаков, возможно это вам подойдет. (По идее, std::to_chars тоже должна так уметь, но пока ее завезли только в MSVC.)

8 мая 2020 в 18:58

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

float valf = 0.012345678900100; double vald = 0.012345678900100; printf("%.20f\n", valf); printf("%.20lf\n", vald); 
0.01234567910432815552 0.01234567890010000030 

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

char buf[30]; sprintf(buf,"%.20lf",val); string s = buf; 
ostringstream os; os  

Только не пишите в никуда, как в вашем примере.

Update

К "артефактам", упомянутым в комментарии. Это не артефакты. Представим, что у нас есть возможность записи только 4 бит. Как вы представите, например, 1/5 в виде суммы дробей вида 1/2 n ?

1/8 + 1/16 + 1/128. Стоп! Уже не можем представить 1/128 - точности не хватает. Так что число 0.20 будет иметь вид 0.1875.

Это - ограничение самого представления. Ну невозможно в общем случае представить дробное число с помощью конечной суммы дробей вида 1/2 n .

Как перевести double в string c

Нередко может возникнуть необходимость объединить строку с данными других типов, например, числами. Однако объединить строку мы можем только с другой строкой. Поэтому данные других типов вначале необходимо преобразовать в строку. Для преобразования в строку применяется функция std:to_string() , в которую передается преобразуемое значение:

#include #include int main() < unsigned age; std::string message< "Age: " + std::to_string(age)>; std::cout 

Функции преобразования из строки в число

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

  • stoi() : преобразует в тип int
  • stol() : в long
  • stoll() : в long long
  • stoul() : в unsigned long
  • stoull() : в unsigned long long
  • stof() : в float
  • stod() : в double
  • stold() : в long double

Все они определены в модуле , работают однотипно и в качестве параметра принимают преобразуемую строку:

std::string str< "123" >; int n< std::stoi(str) >; // n == 123

Преобразование строки в указатель на символы

При необходимости можно преобразовать значение типа string в указатель на символы. Для преобразования в указатель на константную строку применяется метод c_str() :

#include #include int main() < std::string message ; const char* message_ptr = message.c_str(); // преобразуем в указатель std::cout

Для получения указателя также можно применять метод data() , который возвращает указатель на неконстантное значение, если объект string не является константой.

#include #include int main() < std::string message ; char* message_ptr = message.data(); // преобразуем в указатель std::cout

C++ перевод из long double в string

Она преобразует в char*. Потом уже можно в std::string.

22 марта 2009 года
2.5K / / 14.07.2006
В std::string тогда уж проще преобразовывать через std::ostringstream
22 марта 2009 года
42 / / 04.04.2007

Извиняюсь за не сообразительность,
А можно пример кода, как это должно происходить?

Ато у меня всё разобраться не получается

22 марта 2009 года
137 / / 15.08.2004

А можно пример кода, как это должно происходить?

int main ( )
<
long double a = 1.1111111111111 ;
char s [ 32 ] ;

if ( _snprintf ( s , sizeof ( s ) , " %.30f " , a ) < 0 )
cout s [ 31 ] = '\0' ;

Как перевести double в string c

Как получить из переменной типа Double массив char'ов (в MS VC++)?
Нашёл следующее:

string TypeToStr(const double &rhs)

То есть можно потом преобразовать string в массив char. Выглядит иррационально.
Ещё вариант:

char buff [100]; double val = 1.234; sprintf (buff, "%f", val); "cout 

Тут есть опасения выхода за пределы буфера.
Или функции:
char* _ecvt(double value, int count, int* dec, int* sign);
char* _fcvt(double value, int count, int* dec, int* sign);
char* _gcvt(double value, int digits, char* buffer);
тут либо точность задавать жёстко либо буфер опять, да и вообще не очень понятно.
Так нет ли способа получить на выходе из функции *char, чтоб он указывал на массив содержащий просто все цифры числа и точку, отделяющую дробную часть?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *