2 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
在DELPHI中Round()和RoundTo()都是四舍五入的函數(shù),但DELPHI用的四舍五入與一般的四舍五入不同,它采用的是四舍六入五留雙。
即當(dāng)舍或入位大于或小于五時(shí)按四舍五入來處理,而當(dāng)舍或入位等于五時(shí),就要看前面一位是什么,根據(jù)奇進(jìn)偶不進(jìn),它總是返回一個(gè)偶數(shù)值。這種算法其實(shí)是按照銀行家算法,統(tǒng)計(jì)學(xué)上一般都用這種算法,比傳統(tǒng)的"四舍五入"要科學(xué)。在VB、.net相關(guān)的語言中都有這個(gè)問題。
例如:
表達(dá)式 返回值
Round(11.5) 12
Round(10.5) 10
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
如果要使用傳統(tǒng)的"四舍五入"方法,可以使用下面函數(shù):
function RoundEx(R: Real): Int64;
begin
Result:= Trunc(R);
if Frac(R) >= 0.5 then
Result:= Result + 1;
end;
function DRound(const Value: Extended; const Digit: Byte = 0): Extended;
var
tmp: Extended;
begin
tmp := Power(10, Digit);
if Value > 0 then
Result := Value * tmp + 0.5
else
Result := Value * tmp - 0.5;
Result := Trunc(Result) / tmp;
end;

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
代碼如下:***************************************************unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm}
function MakeStr(Value:Integer):string;
var
i: Integer;
str: string;
begin
str := '';
for i := 1 to Value - 1 do
begin
str := str + '0';
end;
Result := '0.' + str + '1';
end; function MyFun(source:Double;cut:Integer):string;
var
p: Integer;
Sstr, Dstr: string;
begin
Sstr := FloatToStr(source);
p := Pos('.', Sstr);
p := p + cut + 1;
if Length(Sstr) < p then
Sstr := Sstr + '0'; if p > 0 then
begin
//末位為 4 舍
if StrToInt(Sstr[p]) <= 4 then
begin
//保留整數(shù)部分
if cut = 0 then
Dstr := Copy(Sstr,1,p-2)
else
Dstr := Copy(Sstr,1,p-1);
Result := Dstr;
end
//末位為 5 判斷
else if StrToInt(Sstr[p]) = 5 then
begin
//5后非0 進(jìn) 1
if Length(Sstr) < p + 1 then
Sstr := Sstr + '0'; if StrToInt(Sstr[p+1]) <> 0 then
begin
//保留整數(shù)部分
if cut = 0 then
Dstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1)
else
Dstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));
Result := Dstr;
end
else begin
//保留整數(shù)部分
if cut = 0 then
begin
//5前為偶 舍
if (StrToInt(Sstr[p-2]) mod 2) = 0 then
begin
Dstr := Copy(Sstr,1,p-2);
Result := Dstr;
end
//5前為奇 進(jìn)
else begin
Dstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1);
Result := Dstr;
end;
end
else
begin
//5前為偶 舍
if (StrToInt(Sstr[p-1]) mod 2) = 0 then
begin
Dstr := Copy(Sstr,1,p-1);
Result := Dstr;
end
//5前為奇 進(jìn)
else begin
Dstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));
Result := Dstr;
end;
end;
end;
end
//末位為 6 進(jìn)
else if StrToInt(Sstr[p]) >= 6 then
begin
//保留整數(shù)部分
if cut = 0 then
Dstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1)
else
//對(duì)應(yīng)進(jìn)位計(jì)算
Dstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));
Result := Dstr;
end;
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
cut: integer;
begin
cut := StrToInt(Trim(Edit3.Text));
Edit2.Text := MyFun(StrToFloat(Edit1.Text ),cut);
end; end.*************************************************實(shí)現(xiàn)效果:
- 2 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報(bào)