Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизОкругление дробной части числа Найти похожие ветки
← →
Cashey (2002-11-12 22:23) [0]Ребята! Помогите, пожалуйста, попроще решить задачу: нужно округлить десятичную дробь до заданного кол-ва знаков после запятой, но так, что бы в случае если изначальное число не имеет такой разрядности в ее конец добавлялись нули до нужной длины?
← →
Алексей Ким (2002-11-12 22:37) [1]format и roundto
← →
Cashey (2002-11-12 22:44) [2]roundto убирает лишние цифры но не добавляет не достающие.
А format тут при чем?
← →
SottNick (2002-11-13 06:33) [3]а format добавляет недостающие
← →
Cruel Bear (2002-11-13 06:42) [4]Roundto использует "Банковское округление", а как округлить математически?
← →
Separator (2002-11-13 08:32) [5]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;
← →
icWasya (2002-11-13 09:18) [6]FormatFloat("0.000000",Value)// округление до 6 знаков после запятой
← →
ShuraGrp (2002-11-13 10:20) [7]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.
← →
SottNick (2002-11-13 11:08) [8]а еще для добавления нулей и округления по правилам все дружно используем
procedure Str(X [: Width [: Decimals ]]; var S);
{Unit System}
← →
BlackTiger (2002-11-13 13:07) [9]Господа! По-моему вы дурью маетесь. Зачем так все усложнять?
Вот мой код (вызов 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;
//--------------------------------------------------
← →
Separator (2002-11-13 13:10) [10]посмотри на > Separator © (13.11.02 08:32)
Чем не устраивает?
← →
valera (2002-11-13 14:16) [11]Можно так
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;
← →
SottNick (2002-11-14 06:55) [12]и всё равно мой ответ самый верный...
: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"
← →
ShuraGrp (2002-11-14 11:15) [13]Аналог 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;
← →
Manic Mechanic (2002-11-14 12:17) [14]
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c