可以参考一下我写的四舍五入的函数//number:要处理的数字 //precision:精确度 //dealtype:处理方式 0:四舍五入 1:进位 2:去位function DealPrecision(number:real;precision:integer;dealtype:integer):real; var tmpNumber:real; tmpPrecision:integer; begin if Abs(number)<0.0001 then begin Result:=0; Exit; end; if precision>=0 then begin Result:=DealPrecisionZ(number,precision,dealtype); exit; end else begin tmpPrecision:=abs(precision); tmpNumber:=number/power(10,tmpPrecision); tmpNumber:=DealPrecisionZ(tmpNumber,1,dealtype); tmpNumber:=tmpNumber*power(10,tmpPrecision); Result:=tmpNumber; end; end;function DealPrecisionZ(number:real;precision:integer;dealtype:integer):real; var s:string; i:integer; tmp:string; strNumber:string; intLength,intIntCount,intPointPos,intFloatCount:integer; intZFFlag:Integer; begin if Abs(number)<0.0001 then begin Result:=0; Exit; end; if number<0 then begin intZFFlag:=-1; end else begin intZFFlag:=1; end; number:=intZFFlag*number; strNumber:=floattostr(number); if copy(strNumber,1,15)='0.0999999999999' then begin strNumber:='0.1'; end; if pos('.',strNumber)>0 then begin if pos('0000000000',strNumber)>pos('.',strNumber) then begin strNumber:=copy(strNumber,1,(pos('0000000000',strNumber)-1)); end; end; intPointPos:=Pos('.',strNumber); if intPointPos=0 then begin number:=intZFFlag*number; result:=number; exit; end; intLength:=length(strnumber); intIntCount:=intPointPos-1; intFloatCount:=intLength-intPointPos; s:='0.'; for i:=1 to (precision+1) do begin s:=s+'0'; end; case dealtype of 0 : begin number:=StrToFloat(copy(FloatToStr(number),1,intPointPos+(Length(s)-2))); tmp:=FormatFloat(s,(number+(5/(power(10,precision+1))))); number:=strtofloat(copy(tmp,0,length(tmp)-1)); end; 1 : begin s:='0.'; for i:=1 to (precision-1) do begin s:=s+'0'; end; s:=s+'1'; if precision<intFloatCount then begin number:=strtofloat(copy(strnumber,0,intIntCount+1+precision))+strtofloat(s); end; end; 2 : begin number:=strtofloat(copy(strnumber,0,intIntCount+1+precision)); end; end; number:=intZFFlag*number; result:=number; end;
x:=1.245;
if x>0 then x:=x+0.005;
if x<0 then x:=x-0.005;
x:=FormatFloat('#.00',X);
if x>0 then x:=x+0.005;
if x<0 then x:=x-0.005;
x:=strtofloat(FormatFloat('#.00',X));
以前也遇到过delphi中四舍五入的问题
把我自己写的一个算法发给你参考
//precision:精确度
//dealtype:处理方式 0:四舍五入 1:进位 2:去位function DealPrecision(number:real;precision:integer;dealtype:integer):real;
var
tmpNumber:real;
tmpPrecision:integer;
begin
if Abs(number)<0.0001 then
begin
Result:=0;
Exit;
end;
if precision>=0 then
begin
Result:=DealPrecisionZ(number,precision,dealtype);
exit;
end
else
begin
tmpPrecision:=abs(precision);
tmpNumber:=number/power(10,tmpPrecision);
tmpNumber:=DealPrecisionZ(tmpNumber,1,dealtype);
tmpNumber:=tmpNumber*power(10,tmpPrecision);
Result:=tmpNumber;
end;
end;function DealPrecisionZ(number:real;precision:integer;dealtype:integer):real;
var
s:string;
i:integer;
tmp:string;
strNumber:string;
intLength,intIntCount,intPointPos,intFloatCount:integer;
intZFFlag:Integer;
begin
if Abs(number)<0.0001 then
begin
Result:=0;
Exit;
end;
if number<0 then
begin
intZFFlag:=-1;
end
else
begin
intZFFlag:=1;
end;
number:=intZFFlag*number;
strNumber:=floattostr(number);
if copy(strNumber,1,15)='0.0999999999999' then
begin
strNumber:='0.1';
end; if pos('.',strNumber)>0 then
begin
if pos('0000000000',strNumber)>pos('.',strNumber) then
begin
strNumber:=copy(strNumber,1,(pos('0000000000',strNumber)-1));
end;
end; intPointPos:=Pos('.',strNumber);
if intPointPos=0 then
begin
number:=intZFFlag*number;
result:=number;
exit;
end;
intLength:=length(strnumber);
intIntCount:=intPointPos-1;
intFloatCount:=intLength-intPointPos;
s:='0.';
for i:=1 to (precision+1) do
begin
s:=s+'0';
end;
case dealtype of
0 :
begin
number:=StrToFloat(copy(FloatToStr(number),1,intPointPos+(Length(s)-2)));
tmp:=FormatFloat(s,(number+(5/(power(10,precision+1)))));
number:=strtofloat(copy(tmp,0,length(tmp)-1));
end;
1 :
begin
s:='0.';
for i:=1 to (precision-1) do
begin
s:=s+'0';
end;
s:=s+'1';
if precision<intFloatCount then
begin
number:=strtofloat(copy(strnumber,0,intIntCount+1+precision))+strtofloat(s);
end;
end;
2 :
begin
number:=strtofloat(copy(strnumber,0,intIntCount+1+precision));
end;
end;
number:=intZFFlag*number;
result:=number;
end;