Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/23: Рейтинг темы: голосов - 23, средняя оценка - 4.96
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574

Ламерский вопрос по арифметике.

02.10.2008, 11:16. Показов 4365. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!!!
Столкнулся вот с такой проблемкой:
В программе я делаю всевозможные вычисления, результаты в строку вывожу функцией FloatToStrF. Все нормально, только заметил что результаты не правильно округляются, мой результат отличен от тех же вычислений на прстом калькуляторе((. Подскажите как это побороть
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2008, 11:16
Ответы с готовыми решениями:

Ламерский вопрос
Я конечно не программист вышего уровня, и из языков работаю тока с пхп, низкоуровнево. Как я давно догадался Java и java-script это разные...

Ламерский вопрос про БП
Собственно чем отличается блок питания AT и ATX ? Хочу использовать в роли "лабораторного".

Ламерский вопрос по VisualFoxPro
В форме есть grid в котором отображаются строки таблицы. Мне надо чтоб пользователь мог удалять записи из таблицы, выбирая их в гриде....

9
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
02.10.2008, 11:20
При работе с этой функцией числа не округляются , обрезаются поэтому попробуйте
использовать стандартные функции округления и покажите код
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.10.2008, 12:36
вот тебе функция математического округления:
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
AnsiString TMainForm::Math_Round(double num, int precision)
{
  char old = DecimalSeparator;
  DecimalSeparator = '.';
  AnsiString s, number = FloatToStr(num);
  bool sign = false;
  double k = num;
  int pos = number.Pos('.');
  int len = number.Length();
  if ((pos == 0) || ((len - pos) <= precision)){
    DecimalSeparator = old;
    return FloatToStrF(k, ffFixed, 15, precision);
  }
  AnsiString prom = number.SubString(1, 1);
  if (prom == '-') sign = true;
  s = number.SubString(pos + precision + 1, 1);
  int i = StrToInt(s);
  if (i >= 5){
   if (sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }else{
   if (!sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }
  DecimalSeparator = old;
  return FloatToStrF(k, ffFixed, 15, precision);
}
2
1 / 1 / 0
Регистрация: 29.09.2008
Сообщений: 18
02.10.2008, 13:18
а разве фукция FloatToStrF не позволяет задавать точность и формат???
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.10.2008, 13:19
точность у нее - это количество знаков после запятой, остальное обрубает просто...
0
1 / 1 / 0
Регистрация: 29.09.2008
Сообщений: 18
02.10.2008, 13:36
почему тогда код
C++
1
2
3
4
5
double a;
AnsiString b;
a=23154.4568987243353453;
b=FloatToStrF(a,ffFixed,18,18);
ShowMessage(b);
выдает 23154,456898724336500000
Получается точность ограничивается и общим количеством цифр и количеством после запятой, причем если число цифр после запятой превышает общее, то выводится вместе с целыми 18 (в данном случае). Причем результат явно не обрубание, а изменение, интересно по какому алгоритму?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.10.2008, 13:40
алгоритм прослеживается слабо, но согласитесь, что это не совсем математическое округление... а вообще если бы было - 23154,456898724336000000, то это до верхней границы, а так даже не скажу, что оно там исполняет... я же представил код именно арифметического округления, проверено на рабочей системе с очень большими требованиями к округлениям
0
1 / 1 / 0
Регистрация: 29.09.2008
Сообщений: 18
02.10.2008, 13:56
Полностью согласен
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
02.10.2008, 16:58  [ТС]
Кучу вариантов перепробовал, ничто не брало.
WooDooMan РЕСПЕКТ!!!! Функция то что надо)

кто будет пользоваться - к проекту надо подрубать 2 либы:
#include <math.h>
#include <math.hpp>
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.04.2009, 15:28
Цитата Сообщение от Антон Посмотреть сообщение
почему тогда код
Code
1
2
3
4
5
double a;
AnsiString b;
a=23154.4568987243353453;
b=FloatToStrF(a,ffFixed,18,18);
ShowMessage(b);
выдает 23154,456898724336500000
Получается точность ограничивается и общим количеством цифр и количеством после запятой, причем если число цифр после запятой превышает общее, то выводится вместе с целыми 18 (в данном случае). Причем результат явно не обрубание, а изменение, интересно по какому алгоритму?
На самом деле пробле в том, что плавающие числа на машине ты не можешь представить с бесконечной точностью. В данном случае ты попросил распечатать double с точностью до 18 знаков после запятой, но реальное машинное представление double'а более грубое, потому ты и увидел округлённое значение. Причём чем больше число, тем меньшую точность после запятой позволяется (потому и формат называется floating point - с плавающей точкой). Для float'ов эта точность ещё меньше, для long double'ов - больше. Если инетерсно - могу более подробно объяснить принцип действия "на пальцах"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2009, 15:28
Помогаю со студенческими работами здесь

Ламерский вопрос о загрузке файлов
Приветствую всех! Это мое первое сообщение на этом форуме. Надеюсь сильно не будете ругать за ламерство, я только учусь. Так вот. написал...

Ламерский вопрос по настройке Oracle
Решил поковырять Oracle, установил, настроил. Далее. Tnsping не проходит, по sql+ не соединяется. Хотя скрипты (например, initjvm.sql)...

Ламерский вопрос про group by и order by
Что то я туплю под вечер... впрочем не факт что завтра лучше будет :) Вопрос: SELECT .... FROM ... GROUP BY .... ORDER BY ... Так...

База 1с из сервер sql (ламерский вопрос)
Не имея сервер 1с, возможно ли подключить базу к sql-серверу? Всегда считал, что нет. Но вчера мне кое-какие доказывали, что можно. База...

Предикат CONTAINING (ламерский вопос :)
Проблема у меня - пишу для себя на Дельфи простенькую СУБД-шку и тут столкнулся с такой проблемой - не могу использовать конструкцию 'where...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru