Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Вниз

Округление 


Стас   (2002-01-22 08:43) [0]

Не могу в Delphi найти функции округления до определенного знака после запятой. Неужели нету? В какой библиотеке ее поискать или самому описывать?



Hawk2   (2002-01-22 09:43) [1]

Попробуй эту:
FORMATNUMERIC("#.##",S) где #.## - маска, а S - число (или можно подставить выражение).



Johnny   (2002-01-22 09:49) [2]

Не знаю, есть ли эта функция в D5, но в D6 есть:
модуль Math, SimpleRoundTo(...)



WhiteRat   (2002-01-22 10:14) [3]

Я делал так:


function RoundExt(Arg: Real; Digits: Byte): Real
var
i: Byte;
rounder: LongInt;
begin
rounder := 1;
for i := 1 to Digits do rounder := rounder*10;
Result := Arg*rounder;
Result := Round(Result);
Result := Result/rounder;
end;



kat   (2002-01-22 10:23) [4]

А я делаю так
function RoundDig(x:real;d:byte):real;
var
s:string;
len, i:integer;
begin
len := length(FloatToStr(x));
str(x:len:d,s);
val(s,result,i);
end;



Johnny   (2002-01-22 11:14) [5]

to WhiteRat
не знаю как у кого, но у меня эта функция в определенном случае работать не будет, например:
RoundExt(1.325,2) будет давать результат 1.32, а не 1,33
хотя
RoundExt(1.3251,2) уже будет 1.33
вероятно это зависит от настроек округления
а вот пример kat вроде работает нормально



Стас   (2002-01-22 11:48) [6]

Удалено модератором



kat   (2002-01-22 12:03) [7]

Добавляешь новый unit (File/New/Unit)
В него вставляешь функцию, получится что-то такое
unit Unit2;
interface
uses Sysutils;
function RoundDig(x:real;d:byte):real;
implementation
function RoundDig(x:real;d:byte):real;
var
s:string;
len, i:integer;
begin
len := length(FloatToStr(x));
str(x:len:d,s);
val(s,result,i);
end;
end.
А потом в том модуле, где надо вызвать определенную в unit2 функцию, в строчке uses напишешь unit2



DmitryS   (2002-01-22 12:34) [8]

Попробуй так

function TruncTo2Digit(Arg: Double): Double;
begin
Result:= Round(Arg * 100.0) / 100.0;
end;

или так

function TruncTo5Digit(Arg: Double): Double;
begin
Result:= Round(Arg * 100000.0) / 100000.0;
end;

Можно испоьзовать Trunc или Round в зависимости от того округлять или отрезать знаки.



dmaznich   (2002-01-22 12:39) [9]

Попробуй так

function TruncTo2Digit(Arg: Double): Double;
begin
Result:= Round(Arg * 100.0) / 100.0;
end;

или

function TruncTo5Digit(Arg: Double): Double;
begin
Result:= Round(Arg * 100000.0) / 100000.0;
end;

Можно использовать Trunc или Round по необходимости.



Стас   (2002-01-22 13:48) [10]

Спасибо всем.
Почему-то мое второе сообщение удалено модератором.
>> kat © (22.01.02 12:03). Молодец, успел(-а) ответить. Воспользуюсь.



Arkady   (2002-01-26 18:38) [11]

К сожалению, использовать функцию round в Delphi нельзя. Если округляемое число находится ровно посередине между двумя целыми числами, то округление производится до ближайшего четного числа. Например, результатом round(4,5) будет 4, а не 5. Предлагаю свой вариант (n – округляемое число, d – число знаков после запятой):

function rnd(n:extended; d:shortInt):extended;
var deg:extended;
begin
deg:=power(10,d);
if n>0 then rnd:=trunc(n*deg+0.5)/deg else
rnd:=trunc(n*deg-0.5)/deg;
end;



Стас   (2002-01-28 07:59) [12]

Вообще-то я уже нашел подходящий вариант, но все равно спасибо. А может просто из 6 Delphi вытянуть эту функцию из Math?




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.014 c
1-66510           IronHawk              2002-02-06 17:01  2002.02.21  
данные из QuickReport.Preview сохранять в 123.txt файл !


1-66558           DimaIv                2002-02-05 13:38  2002.02.21  
как узнать какой нужен UNIT


1-66597           Worr                  2002-02-05 16:36  2002.02.21  
Исключительно ради академического интереса....


3-66471           Shirson               2002-01-28 12:14  2002.02.21  
.xls -> ODBC -> BDE (ADO)


3-66431           Анонимщик             2002-01-26 12:59  2002.02.21  
TADOConnection + ConnectionString + runtime