for i := length(mnumberb) downto 1 do begin
result := infiniteadd(result, fmult(mnumbera, strtointdef(mnumberb[i], 0)) + t);
t := t + '0';
end;
insert('.', result, length(result) - vdecimal + 1);
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'; //处理空字符情况
end; { infinitemult }
function infinitesub(mnumbera, mnumberb: string): string; { 无限位数减法 }
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}
function infinitediv(mnumbera, mnumberb: string;n:integer): string; { 无限位数除法 }
//n为有效数字个数
function vdecimal(mnumber: string):integer;
var m,x:integer;
begin
x:=0;
if pos('.', mnumber) <= 0 then
begin
for m:=length(mnumber) downto 1 do
begin
if mnumber[m]='0' then x:=x+1 else break;
end;
result:=-x;
end
else
result:=length(strright(mnumber, '.'));
end;
function formatnum2(mnumber: string):string;
begin
result:=mnumber;
if pos('.', result )<= 0 then result := result + '.';