|
#1
|
||||
|
||||
Округление
Ума не приложу в чём дело...
Есть функция (с форума): Код:
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
|
||||
|
||||
а может попробуешь это:
Delphi7 help: Delphi syntax: PHP код:
PHP код:
|
#3
|
||||
|
||||
Код:
SuprD[i]:=(0.123456789); SuprD[i]:=RoundTo((SuprD[i]),-5); ShowMessage(FloatToStr(SuprD[i])) Код:
SuprD[i]:=(0.123456789); ShowMessage(FloatToStr(RoundTo((SuprD[i]),-5))); ----- ...мда.. и чего делать? (( |
#4
|
||||
|
||||
если SuprD : array of real;
то возможна ошибка округления при переводе из function RoundTo(...): Double; |
#5
|
||||
|
||||
попробуй для хранения использовать Double или Currency(наиболее точное хранение чисел если диапазон устраивает)
кстати если округляешь для удобства просмотра то можно использовать функцию Format для преобразования в строку Format('%8.2f', [123.456]); Последний раз редактировалось s0Creator, 03.03.2008 в 13:36. |
#6
|
||||
|
||||
Попробовал.. ничего не изменилось.
В принципе - для удобства просмотра.. но потом надо будет реализовать запись в файл.. и туда надо будет писать тоже уже округлённые значения. Так что.. неплохо было бы сами числа сделать таковыми.. (( Ума не приложу в чём может быть дело. ( |
#7
|
|||
|
|||
Цитата:
Почитай "приколы" (проколы) с округлениями: http://delphikingdom.ru/asp/viewitem.asp?catalogid=1217 |
#8
|
||||
|
||||
Мда.. тема явно для детального изучения.. (((
s0Creator, спасибо за помощь! Попробую пока реализовать "для удобства просмотра", а потом подправлю. Только у меня ещё вопрос возник... я изучил по справочнику функцию Format, но так и не понял - для чего именно нужен индекс. Т.е. какую роль здесь играет 8-ка? ("Format('%8.2f', [123.456]);") Дело в том, что запись массива для визуализации я делаю в edit.. ограничить число символов после запятой это получилось, а вот длину самого значения.. это как-то можно сделать через Format? П.С. Phedor, спасибо за ссылку! |
#9
|
||||
|
||||
на счет ширины 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
|
|||
|
|||
А не легче прибавить 1 (как целое число) и потом просто отбросить все числа после запятой?
|