Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 26

Потеря дробной части при преобразовании строки в long double

29.10.2024, 18:46. Показов 3092. Ответов 27
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
У меня программа, которая вводит число в денежном формате (например $1,234,567,890,123.99) и помещает его в строку. Затем копирует введённое значение в новую строку, убирая ненужные символы, оставляя только цифры и дробную точку. После чего переводит полученную строку в число типа long double с помощью функции strtold. Однако при преобразовании строки в long double теряется дробная часть. Как будто функция strtold прекращает преобразование, доходя в преобразуемой строке до дробной точки, хотя дробную точку она должна читать. С чем это может быть связано?
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
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <iomanip>
#include <cstring>
 
using namespace std;
 
const int SIZE = 100;
 
class money {
    long double moneySum;
public:
    money(): moneySum(0) {}
    void mstold(char moneyString[SIZE]) {
        char formattedString[SIZE]{};
        for (unsigned int i = 0, j = 0; i <= strlen(moneyString); i++, j++) {
            if (moneyString[i] != '$' && moneyString[i] != ',')
                formattedString[j] = moneyString[i];
            else
                j--;
        }
        moneySum = strtold(formattedString, NULL);
    }
    void output() const {
        cout << moneySum << endl;
    }
};
 
int main() {
    setlocale(LC_ALL, "Russian");
    char moneyString[SIZE];
    money sum[SIZE];
    int index = 0;
    char choice = 'y';
    while (choice == 'y') {
        cout << "Введите денежную сумму" << endl;
        cin >> setw(SIZE) >> moneyString;
        sum[index++].mstold(moneyString);
        cout << "Вы ввели ";
        sum[index - 1].output();
        cout << "Ввести новую сумму?(y - да, другая клавиша - нет)" << endl;
        cin >> choice;
        if (index >= SIZE) {
            cout << "\nПревышено максимальное число значений" << endl;
            break;
        }
        cout << endl;
    }
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2024, 18:46
Ответы с готовыми решениями:

Ошибка при преобразовании строки в double и обратно
Компилируется без ошибок, после приказа решать, пишет: Необработанное исключение типа &quot;System.FormatException&quot; произошло в...

SQLite. Потеря дробной части чисел
Всем привет. Такая проблема: Есть база, CREATE TABLE myTable (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT...

Проверка наличия дробной части у чисел типа double
На счет заголовка затрудняюсь , а есть еще возможности проверить числа на int или double кроме этого double a; if (((int)a) == a) ...

27
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.11.2024, 12:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от duck123 Посмотреть сообщение
я не думаю что это проблема самих макросов
Странная постановка вопроса.
Аналогия.
Вот вы работаете молотками.
С одного молотка может слететь головка и прилететь в чью-то головку.
У другого молотка такой особенности нет.
Проблема ли это первого молотка, что ваш сосед его юзает и он прилетает вам в голову?
Какой молоток вы выберете?

Цитата Сообщение от alexu_007 Посмотреть сообщение
Дык еще побольше переменных одинаковым именем назовите, потом удивляйтесь, что что-то не так пошло.
Вы серьезно предлагаете называть ВСЕ сущности семантически разными идентификаторами без повторений?!
Вы видели проекты тысяч по десять-пятнадцать-двадцать файлов исходного кода, разрабатываемых десятком команд?
Сейчас грепнул свой проект всего в пять тысяч исходников, насчитал 43 size. Это только size.
Назовёте мне 42 хороших семантических альтернативных названий для size? Чтоб прям очевидно было.

Хороших слов на удивление мало, а кода с каждым днем всё больше и больше.
Даже namespace'ы придумать успели. Вложенные. Чтоб побольше одинаковых идентификаторов писать можно было без проблем.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
07.11.2024, 15:29
Цитата Сообщение от lemegeton Посмотреть сообщение
Назовёте мне 42 хороших семантических альтернативных названий для size?
size01
size02
...
size42
1
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
07.11.2024, 19:23
вспомнилось вот, даже не знаю, почему
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.11.2024, 22:43
Цитата Сообщение от alexu_007 Посмотреть сообщение
size01
size02
...
size42
Я очень надеюсь, что это троллинг и я никогда не увижу в коде что-то типа:
C++
1
2
3
4
size2_t getTotalSize(const CustomVector2 &left14,  const CustomSet3 &rigth11) {
    size2_t size112 = left14.size8() + right11.size43();
    ...
}
0
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,017
12.11.2024, 14:16
Цитата Сообщение от zss Посмотреть сообщение
Так что, или замените setlocale, например, на

C
1
system("chcp 1251 > NUL");

что за бред ? утилита chcp.com не меняет локаль.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.11.2024, 15:32
а если так
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
#include <iostream>
#include <string>
#include <sstream> 
#include <iomanip> 
using namespace std; 
 
long double f(string s){
    stringstream t;
    size_t i=0;
    long double n;
 
    while(s[i]){
        if(isdigit(s[i]) || s[i]=='.')
             t<<s[i];
        i++;
    }
    t>>n;
    return n;
}
 
int main(){
  string s="$1,234,567,890,123.99";
 
  cout<<fixed<<setprecision(2)<<f(s);
  return 0;
}
0
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
12.11.2024, 16:55
Цитата Сообщение от volodin661 Посмотреть сообщение
утилита chcp.com не меняет локаль
Так ТС как раз и не надо менять локаль!
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
14.11.2024, 06:18
Цитата Сообщение от AndreiHanzo Посмотреть сообщение
setlocale(LC_ALL, "Russian");
Замените на
C++
1
setlocale(LC_CTYPE, "Russian");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2024, 06:18

Потеря точности при преобразовании типов
Дан фрагмент кода: double a = Convert.ToDouble(Console.ReadLine()); double b = Math.Truncate(a); int c =...

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

Ошибка в преобразовании строки в double
Почему вот тут все правильно, то есть 5.5 остается 5.5: #include &lt;iostream&gt; void main( int ArgC, char *ArgV ) { char *str = new...

Потеря данных при преобразовании раздела MBR в GPT
Всем привет!Решил HDD 1Tb через прогу Acronis Disk Director преобразовать из MBR в GPT. Процесс завис (может показалось), решил отменить...

Приведение String к Double, если в строке разделителем дробной части является точка
Уже сутки сижу программирую - С# нов для меня, но при отладке возникла проблема и то ли я не соображаю, то ли лыжи не едут. Для примера,...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru