Как конвертировать 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, чтоб он указывал на массив содержащий просто все цифры числа и точку, отделяющую дробную часть?