首页  编辑  

无限位数减法

Tags: /超级猛料/Friends.网友专栏/zswang/函数大全/   Date Created:
下面的函数是ehom编写的
function InfiniteSub(mNumberA, mNumberB: string): string; { 无限位数减法 }
var
 I: Integer;
 T: Integer;
 TemNumA:String;
 minus:Boolean;
begin
 Result := '';
 if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
 if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
 I := Max(Length(StrLeft(mNumberA, '.')), Length(StrLeft(mNumberB, '.'))); //整数部分最大长度
 mNumberA := DupeString('0', I - Length(StrLeft(mNumberA, '.'))) + mNumberA; //整数前补0
 mNumberB := DupeString('0', I - Length(StrLeft(mNumberB, '.'))) + mNumberB; //整数前补0
 T := Max(Length(StrRight(mNumberA, '.')), Length(StrRight(mNumberB, '.'))); //小数部分最大长度
 if ((Length(StrLeft(mNumberA, '.'))) < (Length(StrLeft(mNumberB, '.')))) or(((Length(StrLeft(mNumberA, '.'))) = (Length(StrLeft(mNumberB, '.'))))and(mNumberB<mNumberA))then
 begin
   TemNumA := mNumberA;
   mNumberA := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
   mNumberB := TemNumA + DupeString('0', T - Length(StrRight(TemNumA, '.'))); //小数后补0
   minus:=True;
 end
 else
 begin
   mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
   mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
   minus:=False;
 end;
 I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度
 T := 0; //进位数初始化
 for I := I downto 1 do //从后向前扫描
   if [mNumberA[I], mNumberB[I]] <> ['.'] then begin //不是小数点时
     T := StrToIntDef(mNumberA[I], 0) - T; //累加当前数位
     T := StrToIntDef(mNumberB[I], 0) - T; //累加当前数位
     if (T<0) and (I<>1) then
     begin
       T:=T+10;
       Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
       T := -1; //计算进位数
     end
     else
     begin
       Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
       T := T div 10; //计算进位数
     end;
   end else Result := '.' + Result; //加上小数点
 if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
 while Pos('0', Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
 while Copy(Result, Length(Result), 1) = '0' do
   Delete(Result, Length(Result), 1); //排除小数后无效的0
 if Copy(Result, Length(Result), 1) = '.' then
   Delete(Result, Length(Result), 1); //排除无效小数点
 if Copy(Result, 1, 1) = '.' then Result := '0' + Result; //处理无0小数情况
 if (Result = '') then Result := '0'; //处理空字符情况
 if minus then Result:='-'+Result;
end;