读书人

delphi+ACCESS 四舍五入的有关问题

发布时间: 2012-03-13 11:21:11 作者: rapoo

delphi+ACCESS 四舍五入的问题
我用的模式是delphi+ACCESS ,如何实现四舍五入的问题,比如:-1.245=-1.25;34.567=34.57

[解决办法]

x:=1.245;
if x>0 then x:=x+0.005;
if x<0 then x:=x-0.005;
x:=FormatFloat('#.00',X);

[解决办法]
上面代码有误:

Delphi(Pascal) code
x:=1.245;if x>0 then x:=x+0.005;if x<0 then x:=x-0.005;x:=strtofloat(FormatFloat('#.00',X));
[解决办法]
加个误差4舍5入,x是你的数据

StrToFloat(Format('%0.2',[x+0.0000001]));
[解决办法]
可以参考一下我写的四舍五入的函数

Delphi(Pascal) code
//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; 

读书人网 >.NET

热点推荐