Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-82674
Colonel Isaev
2002-11-06 17:53
2002.11.25
QReport


1-82854
Jeka.
2002-11-14 13:54
2002.11.25
Scroll


6-82885
VIB
2002-09-28 15:51
2002.11.25
Удаленнй сервис


6-82898
Mishel
2002-07-24 15:33
2002.11.25
TServerSocket - Опрос запущеных серверов


1-82773
MixerPro
2002-11-14 15:07
2002.11.25
Надо определить параметры Рабочего Стола.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский