Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/75: Рейтинг темы: голосов - 75, средняя оценка - 4.79
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169

Преобразование строки в число с плавающей точкой

12.02.2016, 14:37. Показов 16107. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой перевода строки в double
Использовал atof
результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdlib>
 
int main(){
    
    const char * str = "7777.65";
    std::cout << atof(str) << std::endl;
    const char * str1 = "77777.65";
    std::cout << atof(str1) << std::endl;
    const char * str2 = "777777.65";
    std::cout << atof(str2) << std::endl;
    const char * str3 = "7777777.65";
    std::cout << atof(str3);
    
    return 0;
}
Выхлоп
7777.65
77777.6
777778
7.77778e+006

Пробовал sstream
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
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <sstream>
#include <string>
 
int main(){
    
    double d = 0.0;
    
    std::string str("7777.65");
    std::stringstream ss(str);
    ss >> d;
    std::cout << d << std::endl;
    
    std::string str1("77777.65");
    ss.str(std::string());
    ss.clear();
    ss << str1;
    ss >> d;
    std::cout << d << std::endl;
    
    std::string str2("777777.65");
    ss.str(std::string());
    ss.clear();
    ss << str2;
    ss >> d;
    std::cout << d << std::endl;
    
    std::string str3("77777777.65");
    ss.str(std::string());
    ss.clear();
    ss << str3;
    ss >> d;
    std::cout << d << std::endl;
    
    return 0;
}
выхлоп
7777.65
77777.6
777778
7.77778e+007

Как преобразовывать строки длинной "77777777.65" ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2016, 14:37
Ответы с готовыми решениями:

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

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

Преобразование строки в число с плавающей точкой
Добрый вечер, Уважаемые программисты! Вопрос, вроде как, детский: как преобразовать значение textbox.text в тип double?! Все методы вроде...

20
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
12.02.2016, 14:55
Лучший ответ Сообщение было отмечено egor2116 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main(){
    
    double d = 77777777.65;
    cout.precision(10);
    cout << d << endl;
    cout.precision(3);
    cout << d << endl;
    
    return 0;
}
Code
1
2
77777777.65
7.78e+07
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.02.2016, 14:56
C++
1
std::fixed
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
12.02.2016, 15:04
а куда девать нули в конце с fixed? или может даже хуже быть
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
 
int main(){
    cout<<fixed<<(double)77777777.0123456789<<endl;
    return 0;
}
Code
1
77777777.012346
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.02.2016, 15:19
vndtta, precision задает точность, а не формат. Возьми например число "77777777777777.65" и убедись сам, что без fixed всё равно будет научный формат.
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
12.02.2016, 16:45
так-то мой первый пост как раз о том, что такое precision
там два вывода для 3 и 10
в твоем случае округление тоже никуда не пропадает http://melpon.org/wandbox/perm... 08bYITQ73f
и вопрос был про строки длиной в 10цифр
Как преобразовывать строки длинной "77777777.65" ?
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
12.02.2016, 17:12  [ТС]
Tulosba, Как при написании программы на с++ вообще отключить преобразование формата в научный ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.02.2016, 17:36
Цитата Сообщение от vndtta Посмотреть сообщение
и вопрос был про строки длиной в 10цифр
Ты ещё скажи, что вопрос был про вывод конкретно числа 77777777.65.
В таком случае можно просто строку "77777777.65" печатать и не париться.
Цитата Сообщение от vndtta Посмотреть сообщение
в твоем случае округление тоже никуда не пропадает
А куда оно должно пропадать? Просто надо понимать, что "точность" (precision) и "фиксированный формат" (fixed) это разные вещи, они дополняют друг друга.
When floatfield is set to fixed, floating-point values are written using fixed-point notation: the value is represented with exactly as many digits in the decimal part as specified by the precision field (precision) and with no exponent part.
Цитата Сообщение от egor2116 Посмотреть сообщение
Как при написании программы на с++ вообще отключить преобразование формата в научный ?
Что значит "вообще"? Чем-то не устраивает fixed?
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
15.02.2016, 09:01  [ТС]
Что значит "вообще"?
Я вывожу результаты преобразований не в консоль, а в sfml::text.
Алгоритм простой.
1. Получил строку вида 77777777.65
2. Преобразовал в число
3. Действие с числом
4. Преобразование в строку(sstream). И на выходе у меня строка вида 7.7778е - 004
Как это можно побороть ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.02.2016, 11:32
Цитата Сообщение от egor2116 Посмотреть сообщение
Как это можно побороть ?
Спрошу ещё раз:
Цитата Сообщение от Tulosba Посмотреть сообщение
Чем-то не устраивает fixed?
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
15.02.2016, 16:53  [ТС]
Чем-то не устраивает fixed?
Тем, что результата нет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.02.2016, 17:23
Цитата Сообщение от egor2116 Посмотреть сообщение
Тем, что результата нет.
Покажи код. А то я не понимаю твоей проблемы, честно говоря.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
16.02.2016, 09:12  [ТС]
А то я не понимаю твоей проблемы, честно говоря.
Да я сам не пойму, что могла возникнуть проблема на ровном месте.
Код достаточно большой, приведу смысловую часть в общем виде.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
sf::String NumericToString(double d){
    std::ostringstream out;
    out.unsetf(std::ios::floatfield);
    out.precision(20);
    
    out << d;
    return out.str();
}
 
class TextField{
 private:
    sf::Text t;
 public:
   void setString(sf::String s){
     t.setString(s);
   }
   void draw(sf::RenderWindow * w){
        w->draw(t);
   }
};
 
class someClass{
 private:
       TextField tf;
 public:
       void exec(){
         double num = 77777777777.65;
         tf.setString(NumericToString(num));
       }
       void draw(sf::RenderWindow * w){
         tf.draw(w);
       }
};
 
class Render{
 private:
     sf::RenderWindow * w;
     someClass eng;
 public:
        Render(){
          w = new sf::RenderWindow();
        }
        void draw(){
            eng.draw(w);
        }
};
 
int main(){
 Render r;
 r.draw();
 
return 0;
 
}
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.02.2016, 09:36
Лучший ответ Сообщение было отмечено egor2116 как решение

Решение

C++
1
out << std::fixed << d;
Пробовали?
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
16.02.2016, 14:07  [ТС]
Пробовали?
Да помогло спс.
Не поможете еще с 1 проблемкой по этой же теме.
Образовывается мусор или некорректный перевод в строке. И чем больше число тем более искаженным получается результат.
Пример
1. (100000000,35 + 1000000.55) в строке получается 101000000.8999999911
2. (77777777,65 + 1) в строке получается 77777778.6500000060

П.С. Походу проще написать свою функцию.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.02.2016, 14:11
Цитата Сообщение от egor2116 Посмотреть сообщение
Да помогло спс.
Хе-хе. Так я ж об этом сразу сказал:
Цитата Сообщение от Tulosba Посмотреть сообщение
std::fixed
Цитата Сообщение от egor2116 Посмотреть сообщение
При переводе числа 100000000,9 в строке получается 101000000.8999999911
С дробной частью всё ясно. Из-за представления вещественных чисел в двоичном коде погрешности представления не избежать. Но вот откуда взялся лишний 1000000, я не понял.
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
16.02.2016, 14:27  [ТС]
Но вот откуда взялся лишний 1000000, я не понял
Извени, я скорректировал сообщение, а ты уже ответил и взял не исправленное.
не избежать
Так а какой выход ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.02.2016, 14:34
Цитата Сообщение от egor2116 Посмотреть сообщение
Так а какой выход ?
Выход: не использовать типы с плавающей точкой, если нужна абсолютная точность. Именно поэтому нельзя использовать такие типы в денежных операциях. Работай с целыми числами, а когда нужно отобразить, отдельно рисуй целую часть (как результат деления целых) и дробную (остаток от деления, т.е. оператор %).
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
16.02.2016, 14:38  [ТС]
Выход
Я думал ты предложишь какую-то супер секретную фу-ю с млн. флагов и у которой сбоку "red button", а придётся все таки пилить свою.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.02.2016, 14:43
Как вариант, можно работать с дробями, а когда нужно, переводить в нужный формат.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2016, 14:43
Помогаю со студенческими работами здесь

Преобразование 64-битного числа в число с плавающей точкой
Доброго всем времени суток! Суть вопроса: Не могу придумать алгоритм преобразования 64-битного числа (последовательность из 8-ми байт)...

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

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

Перевод строки в число с плавающей точкой и обратно
на форме есть Edit/Label/Button (всех по одному), нужно из поля Edit вытащить число с плавающей точкой, выполнить с ним пару математических...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru