Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 9

VS 2017 округляет значение в double

01.06.2019, 17:50. Показов 1421. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Моя программа начисляет процент от суммы остатка. Но при введении суммы равной 6 080 372 517 086 395 и нахождении 44% от это суммы программа выдает число 2 675 363 907 518 014.0 хотя калькулятор выводит число 2 675 363 907 518 013,8. Для меня это большая разница, так как я округляю значение в меньшую сторону. Собственно сам фрагмент программы:
C++
1
2
3
4
5
6
7
8
    
int pr;
in >>pr;
double m,vr;            
m = st[i].money;
vr = (m / 100)*pr;
 
st[i].money =st[i].money+ vr;
В чем может быть проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2019, 17:50
Ответы с готовыми решениями:

Округляет значение double
Всем доброго времени суток. Написал конвертор преобразующие дюймы в футы // Программа для преобразования // дюймов в футы: //...

Помогите написать программу, которая округляет значение на сотые
нужно написать программу которая округляет значение которое вводит пользователь на сотые. Помогите пожалуйста!!))

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

19
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.06.2019, 17:58
Цитата Сообщение от Avatar7 Посмотреть сообщение
хотя калькулятор выводит число 2 675 363 907 518 013,8
Какой калькулятор? Потому что мой выводит 2 675 363 907 518 014...
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 9
01.06.2019, 18:03  [ТС]
Обычный калькулятор встроенный в 10 винду
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.06.2019, 18:07
Цитата Сообщение от Avatar7 Посмотреть сообщение
Обычный калькулятор встроенный в 10 винду
У меня тоже Win10, но результат не совпадает с вашим...
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 9
01.06.2019, 18:12  [ТС]
Скорее всего у вас обычный режим калькулятора, а я проверял на режиме инженерный.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.06.2019, 18:22
Цитата Сообщение от Avatar7 Посмотреть сообщение
Скорее всего у вас обычный режим калькулятора, а я проверял на режиме инженерный.
В инженерном нет нахождения процентов. Разве что умножить на 0.44, так да выдает 2 675 363 907 518 013,8...
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 9
01.06.2019, 18:26  [ТС]
Вот я и умножаю, мне и надо чтоб выводило на конце 13, а программа 13.8 округляет до 14. И это получается только при таком большом значении, обычно округляется в меньшую сторону
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.06.2019, 18:33
Не знаю как там в С++, но например в C# есть 128-и битный тип decimal (для сравнения double 64-х битный), который ваше значение считает корректно.
C#
1
2
decimal x = 6080372517086395;
decimal y = x * 0.44M; // y = 2675363907518013.80M
Наверняка в С++ есть какой-то аналогичный тип с большей точностью чем у double...
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.06.2019, 19:01
https://en.wikipedia.org/wiki/Long_double

А вообще вам нужно разбираться с "длинной арифметикой" (позволяющей работать с произвольно большими целыми числами, хотя и очень медленно в сравнении с числами с плавающей точкой). Можно взять какую-нибудь готовую библиотеку с ними или написать самому...
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.06.2019, 19:03
TRam_, в VC++ long double имеет такую же размерность, что и double т.е. 64 бита вместо 80.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.06.2019, 19:09
Цитата Сообщение от Avatar7 Посмотреть сообщение
В чем может быть проблема?
в том, что:

1.
ты привел некомпилябельный (непроверяемый) обрывок кода,
вместо нормального кода, который проиллюстрировал бы твою проблему.

и на что ты после этого рассчитываешь?
на помощь местных телепатов?

так они ведь в отпусках все.

2.
фрагмент кода, который ты привел,
не соответствует твоему словесному описанию.

согласно твоему словесному описанию, должно быть:

https://rextester.com/IRLY39490

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
int main()
{
    long double value = 6'080'372'517'086'395;
    long double persent = 44;
 
    long double v = value /100.0 * persent;
    
    std::string s = std::to_string(v);
    
    // --- увеличивает точность показа дробной части
    std::cout.setf(std::ios::fixed,std::ios::floatfield);      
    
    std::cout << "v = " << v << '\n';
    std::cout << "s = " << s << '\n';
}
output:
Code
1
2
v = 2675363907518013.800049
s = 2675363907518013.800049
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
01.06.2019, 19:14
Цитата Сообщение от Avatar7 Посмотреть сообщение
В чем может быть проблема?
Выводим соседние числа, представимые в формате double (64-битное плавающее в формате IEEE754)

Code
1
2
3
2675363907518013.500000
2675363907518014.000000
2675363907518014.500000
Все. В представлении double нет никакого числа 2675363907518013.8 и быть не может. 2675363907518014 - ближайшее представимое число. Его вы и получаете.

Так что не "VS 2017 округляет значение в double", а double округляет значение в double. Как и должно быть. Плавающие типы не подходят и не применяются для вычислений, требующих равномерной точности по всему диапазону. В частности, для денежных вычислений.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.06.2019, 19:15
hoggy, переключите компилятор на vc++, и там будет именно 14.000000. Ибо мелокософтовцы не добавляли работу с типом long double, он в их компиляторе обрабатывается как double.
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 9
01.06.2019, 19:21  [ТС]
Все проблема решена. Я писал так
C++
1
vr = (m / 100)*pr;
А нужно было поменять на
C++
1
vr = (m * pr / 100);
И тогда все корректно считает
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
01.06.2019, 19:27
Цитата Сообщение от Avatar7 Посмотреть сообщение
И тогда все корректно считает
Не несите чепухи. Никакого влияния не результат рассматриваемой операции это изменение не окажет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.06.2019, 19:36
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не смешите собравшихся и не несите чепухи.
"собравшиеся" - это ты о себе что ли во множественном числе?
как то не заметно, что бы кто-то смеялся.
0
01.06.2019, 20:10

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
"собравшиеся" - это ты о себе что ли во множественном числе?
Я уверен, что являюсь не единственным посетителем этого форума. И что-то мне подсказывает, что я не являюсь единственным посетителем этой темы )))

Цитата Сообщение от hoggy Посмотреть сообщение
как то не заметно, что бы кто-то смеялся.
И? "Смешить" и "смеяться" - это совершенно разные вещи.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.06.2019, 20:46
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И?
и вот тут ты поправил свой стрёмный пост.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Последний раз редактировалось TheCalligrapher; Сегодня в 19:31.
правильное решение.
я думаю.
0
01.06.2019, 20:56

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
и вот тут ты поправил свой стрёмный пост.
Рука-лицо... На форуме cyberforum.ru не существует способа отредактировать пост, после того, как время редактирования уже истекло и за постом уже появился следующий пост.

Сравниваем:
Мой пост: TheCalligrapher: Последний раз редактировалось TheCalligrapher; Сегодня в 09:31.
Следующий пост: hoggy: Сегодня, 09:36

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.06.2019, 21:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Рука-лицо...
не тупи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2019, 21:32
Помогаю со студенческими работами здесь

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Ввести с клавиатуры вещественное (double) значение x, вывести соответствующее значение y для функции y = f(x)
Всем привет! Нужна помощь в решение данной задач... Буду очень признателен :) График функции y = f(x) задан точками, соединенными...

Java сама округляет double
Совсем глупый вопрос: double q = 5 / 2; System.out.println(q); Почему выводит 2.0, а не 2.5 ?

Деление округляет переменную double до целого
Видемо совсем обленился я думать. Но как все время нормально считало и не округляло а сейчас double ровно до целой округляется и хоть ты...

Почему Си округляет значения чисел типа double?
Имеется два раствора, вводим в программу вес и концентрацию первого, затем вес и концентрацию второго. Затем вводим вес и концентрацию...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru