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

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

29.10.2024, 18:46. Показов 3113. Ответов 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
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,296
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
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,027
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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru