Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
mmoroz
1 / 1 / 0
Регистрация: 20.11.2007
Сообщений: 72
1

Глюки при округлении числа в Delphi5!

21.01.2008, 18:00. Просмотров 1690. Ответов 8
Метки нет (Все метки)

Глюки при округлении числа в Delphi5!
Написал функцию округления :
Вот пример при трассировке функции
fRound(16.095,2)

function fRound(
n: double;//округляемое число
nn: integer//до скольких знаков округляем
): double;
var
v: extended;
vv: extended;
vvv: extended;
begin
v:=StrToFloat(FloatToStr(n));
--трассировка v=16.095
vv:=Power(10,nn);
--трассировка vv=100
vvv:=Int(v*vv);
--трассировка vvv=1609
--трассировка v*vv-vvv=0.5
if v*vv-vvv>=0.5 then
v:=(vvv+1)/vv
else
--трассировка НО УСЛОВИЕ НЕ СРАБАТЫВАЕТ И ПОПАДАЕТ СЮДА
v:=vvv/vv;
--трассировка v=16.09 //а должен быть 16.10
result:=v;
end;

Проблема говорят известная и уже решенная подскажите что делать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2008, 18:00
Ответы с готовыми решениями:

Установка Delphi5-6 под Windows2000
Здраствуйте.... Существует проблема с установкой дельфы под винды 2000....

Как нужно работать на Delphi5 с Active Desktop?
Объясните чайнику, как нужно работать на Delphi5 с Active Desktop (требуется...

Где взять нормальные драйвера для работы с MSSQL2000 из Delphi5?
Для работы понадобились драйвера работы с SQL сервером из Delphi. Условие:...

проблема с использованием функции в проекте Visual Basic, вызываемой из DLL написаной на Delphi5
Привет! У меня возникла проблема с использованием функции в проекте Visual...

Глюки при переподключении TADOConnection
Всем привет. Собственно, эта тема появилась вследствие пока нерешенной...

8
Док
22.01.2008, 15:17 2
Доброго времени суток!

У меня есть следующее предложение. Возможно это прозвучит бредово, но мне помогали скобки в условии, т.е. if ()>=0.5 then ну и так далее. Если не поможет - то это какой-то спецефичный глюк и надо ждать совета специалиста по вычислениям.

Док.
mmoroz
1 / 1 / 0
Регистрация: 20.11.2007
Сообщений: 72
22.01.2008, 19:36  [ТС] 3
Попробовал скобочки... Нифига.
Да кстати если (используя теже самые данные) провести следующее действие:
v*vv-vvv-0.5, то должен быть 0, а получается 0.00...1, т.е. почти ноль но не совсем.
0
gadyuka
0 / 0 / 0
Регистрация: 01.01.2008
Сообщений: 25
23.01.2008, 11:15 4
ммм... а зачем столько заморочек? Если уж Вы перебрасываете число через строку, почему бы не воспользоваться вместо FloatToStr более мощной функцией FloatToStrF, которая, одновременно сама и выполняет округление? Параметр Digits этой функции задает количество знаков после запятой
0
mmoroz
1 / 1 / 0
Регистрация: 20.11.2007
Сообщений: 72
23.01.2008, 13:57  [ТС] 5
Попробовал FloatToStrF... Результат неверный (передаем ему 14.095, а возвращает он 14.09, хотя должен 14.10)
0
ovsjanikov
0 / 0 / 0
Регистрация: 31.01.2008
Сообщений: 7
31.01.2008, 19:05 6
Ребята DELPHI - не глючит !

Если кто не знает математики, поясню :
при округлении числа 13.5 и 14.5
т.е. такого числа у которого 5 в конце
алгоритм округления звучит примерно следующим образом:

1. если целая часть числа четная (14) то число округляется в меньшую сторону, т.е. округление 14.5 даст результат 14
2. если целая часть числа нечётная (13) то число округляется в большую сторону, т.е. округление 13.5 даст результат 14.

Вот такие правила существуют в математике.
0
Johny B.
0 / 0 / 0
Регистрация: 02.02.2008
Сообщений: 26
02.02.2008, 19:43 7
Ребята!!! Ну в самом то деле?!
Это ж и ежу понятно, что Double вам никогда 'красиво' не округлит!

Для более точных вычислений используйте currency.

Ну а если требуется супер-точность, то вставляетй asm.
0
Johny B.
0 / 0 / 0
Регистрация: 02.02.2008
Сообщений: 26
02.02.2008, 19:45 8
вот, уже гоню .. не d, а extended
Код
 // но эт так, мелочи
0
ovsjanikov
0 / 0 / 0
Регистрация: 31.01.2008
Сообщений: 7
02.02.2008, 19:57 9
Во-первых, чего кричиш ? :-)
Во-вторых, какая разница double,extended,currency.
Delphi их все округляет одинаково - не веришь - проверь.
(по крайней мере double и currency это точно).
Я ещё когда программистом в бухгалтерии работал
у нас был тип currency в базе данных
и мы долго мучались не понимая почему округляет по разному.
А потом я спросил у препода в институте (проффесор мат. наук)
и он пояснил мат. правила округления чисел.

Кстати, есть очень простое решение этой проблемы:
но оно действует только для двух знаков после запятой,
если надо больше - домножаешь не на 100 а соответсвенно
1000,10000,... и т.д.

function R(c:currency): currency;
var k,k1,k2:currency;
begin
k:=c*100;
if c>=0 then k1:=k+0.5;
if c<0 then k1:=k-0.5;
k2:=trunc(k1);
r:=k2/100;
end;

С уважением,
Овсяников Максим.
0
02.02.2008, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2008, 19:57

Глюки при работе с Firebird 2.1
Всем привет. Работаю с Firebird 2.1 через IBQuery, DataSource, DBGrid.......

Как создать SQL таблицу на Delphi5?
Подскажите как создать SQL таблицу на Delphi5

Ошибка при округлении
вот пример хочу округлить как обычно большее к большему меньшее к меньшему что...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru