Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как округлить математическое значение в С++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию Как округлить математическое значение в С++ - 01.11.2002, 15:17

Как мне округлить (математическое округление) значения, до 2-ух знаков после запятой, а то при использовании float у меня точность 15 знаков после запятой, а при расчетах это дает офигенную ошибку. Считать надо деньги.
Ответить с цитированием
  (#2 (permalink)) Старый
AssAsin AssAsin вне форума
Member
 
Сообщений: 383
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 02.11.2002
По умолчанию 03.11.2002, 16:50

float, double хранятся как двоичные дроби. Точное представление десятичных дробей возможно только для случая, когда дробная часть выражается конечной комбинацией отрицательных степеней двойки: x.5, x.25, x.125, ... В противном случае ты запишешь 15.15, а прочитаешь что-нибудь вроде 15.1499999. Работая с деньгами, оперируй копейками, чтобы все числа были целыми. Это единственный способ получить абсолютную точность. При этом тип переменной не важен: int, int64, float или double.
Ответить с цитированием
  (#3 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 04.11.2002, 17:29

Спасибо конечно. Но хотелось бы примерчик рабочий увидеть, если нетрудно.
Ответить с цитированием
  (#4 (permalink)) Старый
AssAsin AssAsin вне форума
Member
 
Сообщений: 383
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 02.11.2002
По умолчанию 05.11.2002, 17:59

С примерчиком рабочим швах: давно это было.
Просто умножаешь все свои рубли на 100 и получаешь целые копейки. В таком виде хранишь и обрабатываешь. Проблема возникает при вводе/выводе: каждый раз при выводе /100 (на Delphi я использовал вывод с маской формата), при вводе *100. Но ничего лучше предложить не могу, может народ чем поделится?
Кстати, в доках и примерах по InterBase деньги хранятся в Decimal(размер_не_помню, 2), то есть с двумя знаками после запятой, но размер достаточно мал, чтобы физическое представление было integer (если размер большой, она будет хранить decimal как double).
Ответить с цитированием
  (#5 (permalink)) Старый
Vicin Vicin вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.11.2002
По умолчанию 05.11.2002, 19:03

Не всё так просто , мне надо получить сумму изходя из количества (int) и 2-ух коэффициентов, которые равны 1,5 и 46,96. Если я умножу 1,5*100 и 46,96 на 100, то получу 150 и 4696. Пусть кол-во=111. тогда 111*150/4696=3,545570698, но если стоит int, то в ответе у меня только 3.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
AssAsin AssAsin вне форума
Member
 
Сообщений: 383
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 02.11.2002
По умолчанию 05.11.2002, 23:11

Недопонял. Если не секрет, что означают эти коэффициенты? И, самое главное, какова их размерность?
Ответить с цитированием
  (#7 (permalink)) Старый
Vicin Vicin вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.11.2002
По умолчанию 06.11.2002, 10:33

Коэфф.-ы это деньги. Соответственно 1 р 50 коп. и 46 р. 96 коп. Кол-во это количество ( ) измеряется в штуках (не в тысячах). Изходя из этих чисел мне надо получить переменную, от которой, надо потом узнать процентное соотношение (скока будет 36,36 % от переменной и 63.64% от той же переменной) причем сумма процентного соотношения должна = переменной полученой путем вычислений коэфф-а. Уф аж сам запутался, во бред то
Ответить с цитированием
  (#8 (permalink)) Старый
AssAsin AssAsin вне форума
Member
 
Сообщений: 383
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 02.11.2002
По умолчанию 06.11.2002, 11:33

Цитата:
Originally posted by Vicin
[b]...надо потом узнать процентное соотношение (скока будет 36,36 % от переменной и 63.64% от той же переменной) причем сумма процентного соотношения должна = переменной полученой путем вычислений коэфф-а. Уф аж сам запутался, во бред то :lol:
Хм... Под последним предложением могу подписаться... Вообще-то мне мечталость узнать более предметную постановку задачи. Но попробую разобраться с тем, что есть.

4. Так что же мы получили? А вот что:
(xp1 + xp2) / 10000 = x1 безо всяких погрешностей, поскольку все они целые! Что тебе и нужно было. Подробно: (xp1 + xp2) / 10000 = (x1*3636 + x1*6364) / 10000 = x1 * (3636+6364) / 10000 = x1 * 10000 / 10000 = x1.

Повторюсь: хранишь в базе и обрабатываешь ты целые x1, xp1, xp2; а при выводе на экран (в отчет) ты выводишь значения (x1 / 10^N), (xp1 / 10^(N+4)), (xp2 / 10^(N+4)).

-------------------------

Фу-ух! Что-то чересчур навороченно, аж самому жутко. Не может быть, чтобы нельзя было проще. Во! Вариант2: никаких x1, никаких целых чисел. Берешь xp1 = x * 0.3636, xp2 = x - xp1. Тогда xp1 + xp2 == x с точностью до последнего знака, то есть abs(xp1 + xp2 - x) < 1e-10, к примеру. Если такое годиться, тогда все вышеописанные навороты к черту; если же тебе и миллионная доля копейки существенна, тогда sorry, see previous section.

Мои соболезнования и наилучшие пожелания,
-- AssAsin Soft // We care of you healf!
Ответить с цитированием
  (#9 (permalink)) Старый
Vicin Vicin вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.11.2002
По умолчанию 07.11.2002, 15:01

AssAsin огромное спасибо, попытаюсь теперь переделать так как ты подсказал. А ты заметил, что мы создали одну из самых больших тем . Обязательно уведомлю тебя о результате.
Ответить с цитированием
  (#10 (permalink)) Старый
Vicin Vicin вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.11.2002
По умолчанию 09.11.2002, 15:26

Всё равно не получается вчера( вернее сегодня) до 4 ночи сидел. При вычислениях ну очень большая точность даже при int мне надо, что бы допустим число 79855 у тебя это как х (в идеале 0.7985) стало равно 8000 или 0.8, тогда расчет будет как на калькуляторе.
Ответить с цитированием
  (#11 (permalink)) Старый
AssAsin AssAsin вне форума
Member
 
Сообщений: 383
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 02.11.2002
По умолчанию 09.11.2002, 16:03

Твое личное сообщение получил, ответил, шли мне на email. Эту тему закрывай.
Ответить с цитированием
  (#12 (permalink)) Старый
Vicin Vicin вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.11.2002
По умолчанию 12.11.2002, 16:00

СДЕЛАЛ!!!!
Написал свою функцию. Немного ч/з ж**у но работает
Вечером опишу
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
The cxx: uragana The cxx: uragana вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.05.2003
По умолчанию 22.05.2003, 02:06

дааа.. помню пару бессонных ночей в поисках решения...
вот два рабочих примера:

Код:
double TForm1::Round1(double Argument, int Precision)
{
  double div = 1.0;
  if(Precision >= 0)
    while(Precision--)
      div *= 10.0;
  else
    while(Precision++)
      div /= 10.0;
  return floor(Argument * div + 0.5) / div;
}
и еще... прикол, но РАБОТАЕТ и ПРАВИЛЬНО округляет:

Код:
char buff[10];
float f=1234.56789;
int i;
AnsiString s,r;
//r=s.sprintf(buff, "%10.2f", f);
r=s.sprintf("%.2f", f);
Edit1->Text=r;
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значение цикла do-while Neforma Вопросы начинающих программистов 0 24.02.2011 20:19
Код программы на Delphi, Pascal на математическое моделирование webbir Вопросы начинающих программистов 0 06.12.2010 08:07
Значение FPS??? faridich Любые вопросы от новичков 6 28.11.2010 12:20
Вычисление приближенное значение функции; и точное значение функции Awatar Prolog 1 29.03.2010 21:22
Функция MOD или округлить fredwriter Pascal 3 24.03.2010 16:39
Необходимо округлить результат математической операции до двух знаков Dimson C++ Builder 16 28.08.2008 18:10
Математическое выражение с операциями Януся Prolog 4 30.11.2007 15:10
Преобразование строки в математическое выражение tmp .NET 2 26.11.2005 00:32
Как записать математическое выражение ULtrasonYc С/С++ 6 27.04.2005 08:43
Как округлить float Laime-oz C++ Builder 7 20.03.2005 15:44
Как в PHP округлить число с десятичной точкой? DMn1c PHP 2 27.03.2004 20:43
Как округлить число до целого ? Albert MW Вопросы начинающих программистов 2 03.04.2003 16:28



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов