有两个字符串 '200000000000000000000000000000'   和'199999999999999999999999999800'
都为30位.要使他们相减得到  200 的数字,请问应该如何实现!!!!用strtoint 位数数不够

解决方案 »

  1.   

    必须使用高精度计算方法uses StrUtils, Math, SysUtils;function InfiniteSub(mNumberA, mNumberB: string): string; { 4G位数减法 }
    var
      I: Integer;
      T: Integer;
      TemNumA:String;
      minus:Boolean;
    begin
      Result := '';
      mNumberA:=formatnum(mNumberA);
      mNumberB:=formatnum(mNumberB);
      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(mNumberB[I], 0) - T; //累加当前数位
          T := StrToIntDef(mNumberA[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; { InfiniteSub}http://lysoft.7u7.net
      

  2.   

    ly_liuyang 你函数的我不能用啊,很多地方报错
    请大家帮忙呀,再线等待!!!!!!!!!!!!
      

  3.   

    uses StrUtils, Math, SysUtils;function InfiniteSub(mNumberA, mNumberB: string): string; { 4G位数减法 }
      function StrLeft(const mStr: string; mDelimiter: string): string;
    { 返回左分隔字符串 }
      begin
        Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
      end;  function StrRight(const mStr: string; mDelimiter: string): string;
      begin
        if Pos(mDelimiter, mStr) > 0 then
          Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt)
        else Result := '';
        if pos('\', Result) > 1 then result := StrRight(Result, '\')
      end; { StrRight }
    var
      I: Integer;
      T: Integer;
      TemNumA: string;
      minus: Boolean;
    begin
      Result := '';
    //  mNumberA:=formatnum(mNumberA);
    //  mNumberB:=formatnum(mNumberB);
      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(mNumberB[I], 0) - T; //累加当前数位
          T := StrToIntDef(mNumberA[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; { InfiniteSub}
      

  4.   

    照抄 ly_liuyang兄的,只是加了两个字符串函数