Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Округление дробной части числа [D6, Win95/98]


Cashey ©   (2002-11-12 22:23:00) 

Ребята! Помогите, пожалуйста, попроще решить задачу: нужно округлить десятичную дробь до заданного кол-ва знаков после запятой, но так, что бы в случае если изначальное число не имеет такой разрядности в ее конец добавлялись нули до нужной длины?


Manic Mechanic   (2002-11-14 12:17:00) [1]



function RoundEx(Value: Extended; Precision: ShortInt): Extended;
var Range: Extended;
begin
Range := IntPower(10, Precision);
if Value < 0.0 then
Result := Trunc(Value * Range - 0.5) / Range
else
Result := Trunc(Value * Range + 0.5) / Range;
end;


ShuraGrp   (2002-11-14 11:15:00) [2]

Аналог valera (13.11.02 14:16)
//Округление до заданной точности. В любую сторону от запятой
function RoundToN(const X: Double; const N: TRoundToRange = -2): Double;
var Mult: Double;
begin {simpleroundto}
Mult:= IntPower(10, N);
Result:= Trunc((X / Mult) + sign(X)*0.5) * Mult;
end;


SottNick   (2002-11-14 06:55:00) [3]

и всё равно мой ответ самый верный...
:o)
str(1,25555555:0:4,s);//вернет 1.2556
str(1,25:0:4,s); //вернет 1.2500
str(-1:0:4,s); //вернет -1.0000

и т.д.
а еще можно слева пробелов добавить для выравнивания строки
str(1,25555555:10:4,s);//вернет " 1.2556"
str(1,25:10:4,s); //вернет " 1.2500"
str(-1,25:10:4,s); //вернет " -1.2500"
str(-100,25:10:4,s); //вернет " -100.2500"


valera   (2002-11-13 14:16:00) [4]

Можно так
Function MyRound(InVal : Extended; n : SmallInt) : Extended;
var factor:integer;
begin
if InVal > 0.0 then factor := 5 else factor := -5;
Result:= extended(trunc(round(InVal*int(power(10,n+1))+factor)/10)/power(10,n));
end;


Separator   (2002-11-13 13:10:00) [5]

посмотри на > Separator © (13.11.02 08:32)
Чем не устраивает?


BlackTiger   (2002-11-13 13:07:00) [6]

Господа! По-моему вы дурью маетесь. Зачем так все усложнять?
Вот мой код (вызов RoundUpTo(125.564, 0.01) выдаст 125.56,
а вызов RoundUpTo(125.564, 0.1) выдаст 125.6)

//--------------------------------------------------
function RoundUpTo(DecimalValue: real; Precision: real): real;
var
UpTo,a,b,c,d,e,f: real;
begin
UpTo := Precision;
a := DecimalValue / UpTo;
b := Int(a);
c := (a * 10) - (b * 10);
d := Int(c);
if (d >= 0) And (d < 5) then
e := b
else
e := b + 1
;
f := e * UpTo;
Result := f;
end;
//--------------------------------------------------


SottNick   (2002-11-13 11:08:00) [7]

а еще для добавления нулей и округления по правилам все дружно используем
procedure Str(X [: Width [: Decimals ]]; var S);
{Unit System}


ShuraGrp   (2002-11-13 10:20:00) [8]

RountTo как впрочем и SimleRoundTo не корректно работают с отрицательными числами. Добавление нулей действительно Format,
а корректный код округления (пока проблем не находил):
unit Routins;

interface

// возводит число в целую степень
function IntPower(var X:Double;var I:Integer):Double; cdecl; export;

// возводит десять в целую степень
function IntPower10(var I:Integer):Double; cdecl; export;

// округляет ANumber до AToDigit знаков после запятой
function RoundTo(var ANumber:Double;var AToDigit:Integer): Double; cdecl; export;

implementation

function IntPower(var X:Double;var I:Integer):Double;
{ Invariant: Y >= 0 & Result*X**Y = X**I. Init Y = I and Result = 1. }
var
Y: Integer;
begin
Y := Abs(I);
Result := 1.0;
while Y > 0 do begin
while not Odd(Y) do begin
Y := Y shr 1;
X := X * X;
end;
Dec(Y);
Result := Result * X;
end;
if I < 0 then Result := 1.0 / Result;
end;

function IntPower10(var I:Integer):Double;
var
Z: Double;
begin
Z := 10;
Result := IntPower(Z,I);
end;

function RoundTo(var ANumber:Double;var AToDigit:Integer): Double;
var fr: double;
function RoundUp(X: Double): longint;
begin
if X < 0
then Result := Trunc(X-0.5)
else Result := Trunc(X+0.5);
end;
var
MP: Double;
begin
MP := IntPower10(AToDigit);
if AToDigit < 0
then
begin
fr := frac(ANumber);
if fr 0
then
begin
fr := RoundUp(fr/MP)*MP;
Result := Trunc(ANumber) + fr;
end
else Result := ANumber;
end
else Result := RoundUp(ANumber/MP)*MP;
end;

end.


icWasya   (2002-11-13 09:18:00) [9]

FormatFloat("0.000000",Value)// округление до 6 знаков после запятой


Separator   (2002-11-13 08:32:00) [10]

function Okr(Value: double; Digit: byte): string;
var
Factor: Extended;

begin
Factor:= Int(Exp(Digit*Ln(10)));
Result:= Format("%0:." + IntToStr(Digit) + "f", [Round(Factor*Value)/Factor]);
end;


Cruel Bear   (2002-11-13 06:42:00) [11]

Roundto использует "Банковское округление", а как округлить математически?


SottNick   (2002-11-13 06:33:00) [12]

а format добавляет недостающие


Cashey   (2002-11-12 22:44:00) [13]

roundto убирает лишние цифры но не добавляет не достающие.
А format тут при чем?


Алексей Ким   (2002-11-12 22:37:00) [14]

format и roundto


Наверх

Титульная страница Поиск, карта сайта Написать письмо