Selasa, 28 September 2010

Fungsi Pembulatan untuk Bilangan Desimal

Delphi telah menyediakan fungsi ROUND untuk membulatkan sebuah bilangan. Dengan fungsi round ini sebuah bilangan seperti 23.4 dapat dibulatkan menjadi 23 atau 23.6 dibulatkan menjadi 24.

Sekarang bagaimana kalau kasusnya membulatkan bilangan desimal seperti 23 menjadi 20 atau 24 menjadi 25..??

Buat saja fungsi round sendiri, berikut ini saya sertakan contoh fungsi untuk membulatkan sebuah bilangan desimal.
Cara menggunakan cukup ketik CUSTOMROUND(23,'d',1) atau CUSTOMROUND(24,'u',1) dimana 'd' untuk pembulatan ke bawah dan 'u' untuk pembulatan keatas. Mudah-mudahan dengan fungsi ini bisa bermanfaat, khususnya untuk membangun aplikasi financial.

function GenerateZeros(iCount: Int64): string;
function CustomRound(rValue: Extended; cRoundType: char; iNumofDigits: Integer): Int64;

function GenerateZeros(iCount: Int64): string;
var i: Int64;
sTemp: string;
begin
i := 1;
sTemp := '';
while i <= i Count do begin sTemp := sTemp + '0'; i := i + 1; end; Result := sTemp; end; function CustomRound(rValue: Extended; cRoundType: char; iNumofDigits: Integer): Int64; var sTemp, sFirstPart, sSecondPart: string; iTemp1, iTemp2: Int64; iFirstNumOfSecondPart: byte; begin //buang angka desimal sTemp := IntToStr(Trunc(rValue)); if Length(sTemp)>iNumofDigits then
begin

sFirstPart := Copy(sTemp, 1, Length(sTemp)-iNumofDigits);
sSecondPart := Copy(sTemp, Length(sTemp)-iNumofDigits+1, iNumofDigits);

iFirstNumOfSecondPart := StrToInt(sSecondPart[1]);

if cRoundType = 'U' then
begin
if (StrToInt(sSecondPart)<>0) then
begin
if (iFirstNumOfSecondPart>=1) and (iFirstNumOfSecondPart<=5) then begin sSecondPart := '5' + GenerateZeros(Length(sSecondPart)-1); end else if (iFirstNumOfSecondPart>=6) and (iFirstNumOfSecondPart<=9) then begin sFirstPart := IntToStr(StrToInt(sFirstPart)+1); sSecondPart := GenerateZeros(Length(sSecondPart)); end; end; end else if cRoundType = 'D' then begin if (StrToInt(sSecondPart)<>0) then
begin
if (iFirstNumOfSecondPart>=1) and (iFirstNumOfSecondPart<=5) then begin sSecondPart := GenerateZeros(Length(sSecondPart)); end else if (iFirstNumOfSecondPart>=6) and (iFirstNumOfSecondPart<=9) then
begin
sSecondPart := '5' + GenerateZeros(Length(sSecondPart)-1);
end;
end;
end;

Result := StrToInt(sFirstPart + sSecondPart);
end
else
begin
Result := StrToInt(FormatFloat('#,#',rValue));
end;
end;

Tidak ada komentar: