猿问

如何用delphi实现下面的内容?

四舍六入,五看前后,五后非零则进一,五后为零视奇偶,五前为奇则进一,五前为偶则舍去?

BIG阳
浏览 117回答 2
2回答

繁华开满天机

在DELPHI中Round()和RoundTo()都是四舍五入的函数,但DELPHI用的四舍五入与一般的四舍五入不同,它采用的是四舍六入五留双。即当舍或入位大于或小于五时按四舍五入来处理,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。这种算法其实是按照银行家算法,统计学上一般都用这种算法,比传统的"四舍五入"要科学。在VB、.net相关的语言中都有这个问题。例如:表达式 返回值Round(11.5) 12Round(10.5) 10RoundTo(1234567, 3) 1234000RoundTo(1.234, -2) 1.23RoundTo(1.235, -2) 1.24RoundTo(1.245, -2) 1.24如果要使用传统的"四舍五入"方法,可以使用下面函数:function RoundEx(R: Real): Int64;beginResult:= Trunc(R);if Frac(R) >= 0.5 thenResult:= Result + 1;end;function DRound(const Value: Extended; const Digit: Byte = 0): Extended;vartmp: Extended;begintmp := Power(10, Digit);if Value > 0 thenResult := Value * tmp + 0.5elseResult := Value * tmp - 0.5;Result := Trunc(Result) / tmp;end;

呼如林

代码如下:***************************************************unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = 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; varForm1: TForm1; implementation {$R *.dfm}function MakeStr(Value:Integer):string;vari: Integer;str: string;beginstr := '';for i := 1 to Value - 1 dobeginstr := str + '0';end;Result := '0.' + str + '1';end; function MyFun(source:Double;cut:Integer):string;varp: Integer;Sstr, Dstr: string;beginSstr := FloatToStr(source);p := Pos('.', Sstr);p := p + cut + 1;if Length(Sstr) < p thenSstr := Sstr + '0'; if p > 0 thenbegin//末位为 4 舍if StrToInt(Sstr[p]) <= 4 thenbegin//保留整数部分if cut = 0 thenDstr := Copy(Sstr,1,p-2)elseDstr := Copy(Sstr,1,p-1);Result := Dstr;end//末位为 5 判断else if StrToInt(Sstr[p]) = 5 thenbegin//5后非0 进 1if Length(Sstr) < p + 1 thenSstr := Sstr + '0'; if StrToInt(Sstr[p+1]) <> 0 thenbegin//保留整数部分if cut = 0 thenDstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1)elseDstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));Result := Dstr;endelse begin//保留整数部分if cut = 0 thenbegin//5前为偶 舍if (StrToInt(Sstr[p-2]) mod 2) = 0 thenbeginDstr := Copy(Sstr,1,p-2);Result := Dstr;end//5前为奇 进else beginDstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1);Result := Dstr;end;endelsebegin//5前为偶 舍if (StrToInt(Sstr[p-1]) mod 2) = 0 thenbeginDstr := Copy(Sstr,1,p-1);Result := Dstr;end//5前为奇 进else beginDstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));Result := Dstr;end;end;end;end//末位为 6 进else if StrToInt(Sstr[p]) >= 6 thenbegin//保留整数部分if cut = 0 thenDstr := IntToStr(StrtoInt(Copy(Sstr,1,p-2)) + 1)else//对应进位计算Dstr := FloatToStr(StrToFloat(Copy(Sstr,1,p-1)) + StrToFloat(MakeStr(cut)));Result := Dstr;end;end;end; procedure TForm1.Button1Click(Sender: TObject);varcut: integer;begincut := StrToInt(Trim(Edit3.Text));Edit2.Text := MyFun(StrToFloat(Edit1.Text ),cut);end; end.*************************************************实现效果:
随时随地看视频慕课网APP

相关分类

数据结构
我要回答