必须使用高精度计算方法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
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}
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
请大家帮忙呀,再线等待!!!!!!!!!!!!
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}