Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.02.2008, 17:38
Аватар для Ромео
Ромео Ромео вне форума
Прохожий
 
Регистрация: 21.02.2008
Сообщения: 15
Репутация: 10
Вопрос Округление

Ума не приложу в чём дело...
Есть функция (с форума):

Код:
function RoundEx(X: Double; Precision: Integer ): Double;
{
Precision :
1 - до целых
10 - до десятых
100 - до сотых
...
}
var
  ScaledFractPart, Temp: Double;
begin
  ScaledFractPart := Frac(X) * Precision;
  Temp := Frac(ScaledFractPart);
  ScaledFractPart := Int(ScaledFractPart);
  if Temp >= 0.5 then
    ScaledFractPart := ScaledFractPart + 1;
  if Temp <= -0.5 then
    ScaledFractPart := ScaledFractPart - 1;
  RoundEx := Int(X) + ScaledFractPart / Precision;

Затем...
Такой вот строчкой всё зашибись как работает:
Код:
RoundEx(0.123456789, 100000);

А вот такой вот комбинацией в цикле в своей проге пишу:
Код:
        SuprD[i]:=RoundEx((0.1*Scpp[i]/D),100000);
        ShowMessage(FloatToStr(SuprD[i]));
...и не пашет.. Т.е . не округляет.. Я наверное спёкся просто, но объясните мне, где ошибка?
Ответить с цитированием
  #2  
Старый 29.02.2008, 17:58
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

а может попробуешь это:
Delphi7 help:
Delphi syntax:

PHP код:
type TRoundToRange = -37..37;
function 
RoundTo(const AValueDouble; const ADigitTRoundToRange): Double;

RoundTo(12345673)    = 1234000
RoundTo
(1.234, -2)    = 1.23
RoundTo
(1.235, -2)    = 1.24
RoundTo
(1.245, -2)    = 1.24 
или

PHP код:
typedef Word TSimpleRoundToRange;
extern PACKAGE double __fastcall SimpleRoundTo(const double AValue, const TSimpleRoundToRange ADigit = -2);

SimpleRoundTo(12345673)    = 1234000
SimpleRoundTo
(1.234, -2)    = 1.23
SimpleRoundTo
(1.235, -2)    = 1.24
SimpleRoundTo
(-1.235, -2)    = -1.23 
Ответить с цитированием
  #3  
Старый 03.03.2008, 12:55
Аватар для Ромео
Ромео Ромео вне форума
Прохожий
 
Регистрация: 21.02.2008
Сообщения: 15
Репутация: 10
По умолчанию

Код:
        SuprD[i]:=(0.123456789);
        SuprD[i]:=RoundTo((SuprD[i]),-5);
        ShowMessage(FloatToStr(SuprD[i]))
Итогом выдаёт сообщения: 0,123460002243519

Код:
        SuprD[i]:=(0.123456789);
        ShowMessage(FloatToStr(RoundTo((SuprD[i]),-5)));
Итогом выдаёт сообщения: 0,12346

-----
...мда.. и чего делать? ((
Ответить с цитированием
  #4  
Старый 03.03.2008, 13:08
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

если SuprD : array of real;
то возможна ошибка округления при переводе из
function RoundTo(...): Double;
Ответить с цитированием
  #5  
Старый 03.03.2008, 13:16
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

попробуй для хранения использовать Double или Currency(наиболее точное хранение чисел если диапазон устраивает)

кстати если округляешь для удобства просмотра то можно использовать функцию Format для преобразования в строку
Format('%8.2f', [123.456]);

Последний раз редактировалось s0Creator, 03.03.2008 в 13:36.
Ответить с цитированием
  #6  
Старый 03.03.2008, 14:06
Аватар для Ромео
Ромео Ромео вне форума
Прохожий
 
Регистрация: 21.02.2008
Сообщения: 15
Репутация: 10
По умолчанию

Попробовал.. ничего не изменилось.
В принципе - для удобства просмотра.. но потом надо будет реализовать запись в файл.. и туда надо будет писать тоже уже округлённые значения.
Так что.. неплохо было бы сами числа сделать таковыми.. ((
Ума не приложу в чём может быть дело. (
Ответить с цитированием
  #7  
Старый 03.03.2008, 15:21
Phedor Phedor вне форума
Начинающий
 
Регистрация: 28.02.2008
Сообщения: 118
Репутация: 21
По умолчанию

Цитата:
Сообщение от Ромео
Попробовал.. ничего не изменилось.
В принципе - для удобства просмотра.. но потом надо будет реализовать запись в файл.. и туда надо будет писать тоже уже округлённые значения.
Так что.. неплохо было бы сами числа сделать таковыми.. ((
Ума не приложу в чём может быть дело. (

Почитай "приколы" (проколы) с округлениями:
http://delphikingdom.ru/asp/viewitem.asp?catalogid=1217
Ответить с цитированием
  #8  
Старый 03.03.2008, 15:58
Аватар для Ромео
Ромео Ромео вне форума
Прохожий
 
Регистрация: 21.02.2008
Сообщения: 15
Репутация: 10
По умолчанию

Мда.. тема явно для детального изучения.. (((
s0Creator, спасибо за помощь! Попробую пока реализовать "для удобства просмотра", а потом подправлю. Только у меня ещё вопрос возник... я изучил по справочнику функцию Format, но так и не понял - для чего именно нужен индекс. Т.е. какую роль здесь играет 8-ка? ("Format('%8.2f', [123.456]);") Дело в том, что запись массива для визуализации я делаю в edit.. ограничить число символов после запятой это получилось, а вот длину самого значения.. это как-то можно сделать через Format?
П.С. Phedor, спасибо за ссылку!
Ответить с цитированием
  #9  
Старый 03.03.2008, 17:39
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

на счет ширины 8 это минимальная ширина
попробуй с FormatFloat http://delphibasics.ru/FormatFloat.php
и
FloatToStrF http://delphibasics.ru/FloatToStrF.php
и по округлению в обсуждении еще интересные примеры
но то банковское округление обсудают
http://delphikingdom.ru/asp/articles...ArticleID=1217
еще набрел на не плохую ссылку по Делфи
http://mf.grsu.by/UchProc/konspekt/delphi

в общем удачи
---
в файле тоже в строковом виде можно хранить
---
а в БД есть специальные форматы - двоично-десятичные
---
мне в общем-то для работы это пока не надо с очень точьными и банковскими вычислениями дела пока не имел
обычно просто форматирую при отображении для восприятия,
но если детально изучишь тисни статейку (всетаки интересно)

Ответить с цитированием
  #10  
Старый 03.03.2008, 19:26
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

А не легче прибавить 1 (как целое число) и потом просто отбросить все числа после запятой?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter