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

Получение корректной дробной части без modf()

24.01.2024, 19:10. Показов 2861. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я получаю дробную часть, но по факту на месте .24 стоит 2399998, по сути я могу получать еще тысячную часть и на ее основе округлять число, но может быть есть еще способы?
C++
1
2
3
4
5
6
  
  float f = 10.24;
  int ff = (f - (int)f) * 100;
  std::cout << ff % 10 << '\n';
  ff /= 10;
  std::cout << ff % 10 << '\n';
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2024, 19:10
Ответы с готовыми решениями:

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

Деление без откидывания дробной части
привет обитателям форума. у меня вот такая вот проблемка, задание простое но поделить не могу никак. ***** Задан массив из 10...

программа выводит целое число без дробной части, почему ?
программа выводит целое число без дробной части, почему ? void Cmy1Dlg::OnBnClickedButton1() { CString str1,str2,str3; ...

32
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
26.01.2024, 12:49
Студворк — интернет-сервис помощи студентам
LudeiViktorovi4, это не обоснование. Компилятор всё равно всё считает в double, поэтому надо в нём и считать. Перед записью в файл можно подрезать

ещё и скорость работы программы увеличится
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
26.01.2024, 13:36
Цитата Сообщение от KSergey9 Посмотреть сообщение
Если же "я хочу точный результат всегда" - то это очень скользкая материя "точный результат".
В общем случае этого достичь невозможно. Никакими силами вы не запишете в память компьютера все цифры числа Пи.
Цитата Сообщение от KSergey9 Посмотреть сообщение
С другой стоны, почему вы хотите получить значение координаты именно .24 ? чем .2399998 вас не устраивает? какое-то оборудование не работает?
О, я сталкивался с похожей проблемой. Писал автоматизацию для какого-то источника питания. Он принимал команду, например, VOLT 1.23 и выставлял 1.23 В. Какое-то время все работало нормально, а потом внезапно переставало. Долго разбирались в чем может быть дело. Изменяли мы напряжение плавно от 0 до максимума, потом снова в 0 и снова в максимум, и проблема была при переходе через ноль. Оказалось, что формат %.3g, который я обычно использую для человеко-читаемого вывода, переходил от обычной записи к экспоненциальной. Не 0.0001, а 1e-4. Прибор такую странную запись не понимал и впадал в ступор.

Добавлено через 4 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Компилятор всё равно всё считает в double
Кто вас так обманул? Ну ладно, опустим тот факт, что компилятор ничего не считает (разве что константы иногда), считает процессор. Но это так, мелкое уточнение.
А машина (в соответствии с кодом, сгенерированным компилятором, естественно - вы ведь наверняка это и имели в виду) считает в том формате, в котором может. Если FPU нет вообще, будет эмулировать через целые числа, что медленно. Если FPU только 32-битный, то на нем. И только если имеется FPU на 64 бита, может считать в double. Причем если установлены и 32-, и 64-битные, вполне может воспользоваться более быстрым 32-битным.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
26.01.2024, 13:42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В общем случае этого достичь невозможно. Никакими силами вы не запишете в память компьютера все цифры числа Пи.
Я не про этот случай.
Я про тот случай, который рассматривает автор: в десятичной записи при вычитании 10 из 10.24 он ожидает увидеть 0,24
Но в том и штука, что даже в этом случае - хотя мы как бы не про изначально иррациональное число говорим - таки "точный результат" на числах double получить не удастся. Вот я о чем. И надо очень постараться в этом случае сформулировать что есть "точный результат". Потому как завтра захочется из 10.243 вычесть 10 - и тут надо как-то понять, что мы уже 3 знака после запятой хотим получить. Как? А не понятно в общем случае. Только автор знает.

Проще сказать6 мне надо 2 знака после запятой. и если это так - то просто отформатировать и проблема исчезнет сама собой.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,026
26.01.2024, 14:02
Цитата Сообщение от KSergey9 Посмотреть сообщение
хотя мы как бы не про изначально иррациональное число говорим - таки "точный результат" на числах double получить не удастся
А тут тоже достаточно понимать структуру iee754. В машине числа хранятся в двоичном формате. То есть из десятичной дроби, где каждая цифра умножается на 10 в какой-то степени, надо перевести в двоичную, где умножается на 2 в какой-то степени. Даже если мы переводим обычное рациональное число, можно получить бесконечную периодическую дробь.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Потому как завтра захочется из 10.243 вычесть 10 - и тут надо как-то понять, что мы уже 3 знака после запятой хотим получить.
3-5 значащих цифр для float, помните.
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
26.01.2024, 15:26
Цитата Сообщение от gunslinger Посмотреть сообщение
у меня (в билдере) твой код выводит 0.239999771118164
Попробуй оператор приведения static_cast <тип_назначения>(приводимый объект) :
C++
1
2
3
4
5
6
7
int main()
{
    double f = 10.25 ;
    f = (f - static_cast<int>(f));
    std::cout << f;
}
//0.25
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
26.01.2024, 15:42
commun, тут ответ совпадает (даже если заменить double на float).
Результат, как уже было сказано выше, зависит (кроме всего прочего) также от исходного числа.
1
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
26.01.2024, 16:21
Цитата Сообщение от gunslinger Посмотреть сообщение
зависит (кроме всего прочего) также от исходного числа.
for example?
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
26.01.2024, 16:39
Например, те же 10.24 (из первого поста).
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
26.01.2024, 17:28
Цитата Сообщение от gunslinger Посмотреть сообщение
те же 10.24 (из первого поста).
Не знаю, у меня в норме. Ну попробуй еще:
C++
1
2
3
4
5
6
7
int main()
{
    float f = 10.24 ;
    f = (f - static_cast<float>(static_cast<int> (f)));
    std::cout << f;
}
//0.24
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
26.01.2024, 18:20
Результат: 0.239999771118164
Да и бог с ним. Вроде обо всем этом в теме уже в основном сказали.
1
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
26.01.2024, 19:49
Цитата Сообщение от gunslinger Посмотреть сообщение
в основном сказали.
Да, но просьба: проверь у себя, пожалуйста:
C++
1
2
3
4
{
    float f = 10.24 ;
    std::cout << f << endl;
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
26.01.2024, 21:02
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
3-5 значащих цифр для float, помните.
Я все прекрасно помню.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А тут тоже достаточно понимать структуру iee754.
Я там выше ссылку давал, надеюсь ТС её прочел. Иначе швах.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
26.01.2024, 22:36
commun, 10.2399997711182
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2024, 22:36

УТ 11.4 Количество в документе без дробной части
Товар покупают в кг, а продают в ведрах. Можно как то сделать, чтобы в документе количество можно было ставит только кратно коэффициенту...

Перестановка значений переменных используя побитовую операцию ^ (без потери дробной части)
Создайте две переменные типа double, присвоив им значения 1.1 и 2.2 поменяйте значения переменных местами с помощью побитовой операции ^...

Найти среднее арифметическое между суммами 1-й и 2-й цифр целой части и 2-й и 3-й цифрами дробной части числа
Номер 3. Дробная часть числа состоит из 3-х цифр. Найти среднее арифметическое между суммами 1-й и 2-й цифрами 2-й и 3-й цифрами дробной...

Получение корректной ссылки из html
Доброго времени суток! Пытаюсь разобраться с регулярными выражениями, а именно из страницы вычленить ссылку без всего лишнего. ссылка...

Дано положительное вещественное число Х. Определить, равна ли первая цифра его дробной части последней цифре целой части
Дано положительное вещественное число Х. Определить, равна ли первая цифра его дробной части последней цифре целой части. Данные должны...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
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,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru