这里有个大数减法,可以给你一点丝路:
program HighDec;
{$APPTYPE CONSOLE}
uses
SysUtils;var
n1,n2,n3,n4:string; {n1:被减数;n2:减数;n3:中间数;n4:结果}
add:integer; {小数点右移的位数,既n1和n2中较长的小数位数}
len:integer; {添零化整对齐后的n1和n2的长度}
procedure DecInit;
var i,p,p1,p2:integer; {p1:n1中小数点的位置;p2:n2中小数点的位置;i,p:辅助变量}
begin
p:=pos('.',n1); //求N1中小数点的位置P1,并截去小数点
if p=0 then p1:=0
else
begin
p1:=length(n1)-p;
delete(n1,p,1);
end;
p:=pos('.',n2); //求N2中小数点的位置P2,并截去小数点
if p=0 then p2:=0
else
begin
p2:=length(n2)-p;
delete(n2,p,1);
end;
if p1>p2 then //若N1和N2的小数位数不等,则在小数位数较短的串的尾部补零
begin
add:=p1;
for i:=1 to p1-p2 do n2:=n2+'0';
end
else
begin
add:=p2;
for i:=1 to p2-p1 do n1:=n1+'0';
end;
if length(n1)<length(n2) then //整数位数不等时,在头部添零
repeat
n1:='0'+n1;
until length(n1)=length(n2);
if length(n2)<length(n1) then
repeat
n2:='0'+n2;
until length(n1)=length(n2);
end;procedure Sub;
var i,j,k:integer;
begin
n4:='';
SetLength(n4,len+5);
for i:=len downto 1 do
if n1[i]>=n2[i] then //够减
n4[i]:=chr(ord('0')+ord(n1[i])-ord(n2[i]))
else
begin //借位
n4[i]:=chr(ord('0')+10+ord(n1[i])-ord(n2[i]));
j:=i-1;
while n1[j]='0' do
begin
n1[j]:='9';
dec(j);
end;
end;
n4:=copy(n4,1,len-add)+'.'+copy(n4,len-add+1,add); {在结果串中移入小数点}
while n4[length(n4)]='0' do delete(n4,length(n4),1); {截去尾部的零}
while (n4[1]='0') and (n4[2]<>'.') do delete(n4,1,1); {截去结果串头部的零}
if n4[length(n4)]='.' then delete(n4,length(n4),1); {整数截去小数点}
end;procedure doDec;
var i:integer;
begin
DecInit;
len:=length(n1);
i:=1;
n4:='';
while (i<=len) and (n1[i]=n2[i]) do inc(i);
//按高位到低位的顺序搜索两个数中第一个数字不同的位
if i>len then n4:='0'
else
begin
if n1[i]>n2[i] then
Sub
else
begin
n3:=n1;n1:=n2;n2:=n3;
Sub;
n4:='-'+n4;
end;
end;
end;begin //主函数调用例子
n1:='3.588899';
n2:='38.588899';
doDec;
writeln(n4);
readln;
end.
program HighDec;
{$APPTYPE CONSOLE}
uses
SysUtils;var
n1,n2,n3,n4:string; {n1:被减数;n2:减数;n3:中间数;n4:结果}
add:integer; {小数点右移的位数,既n1和n2中较长的小数位数}
len:integer; {添零化整对齐后的n1和n2的长度}
procedure DecInit;
var i,p,p1,p2:integer; {p1:n1中小数点的位置;p2:n2中小数点的位置;i,p:辅助变量}
begin
p:=pos('.',n1); //求N1中小数点的位置P1,并截去小数点
if p=0 then p1:=0
else
begin
p1:=length(n1)-p;
delete(n1,p,1);
end;
p:=pos('.',n2); //求N2中小数点的位置P2,并截去小数点
if p=0 then p2:=0
else
begin
p2:=length(n2)-p;
delete(n2,p,1);
end;
if p1>p2 then //若N1和N2的小数位数不等,则在小数位数较短的串的尾部补零
begin
add:=p1;
for i:=1 to p1-p2 do n2:=n2+'0';
end
else
begin
add:=p2;
for i:=1 to p2-p1 do n1:=n1+'0';
end;
if length(n1)<length(n2) then //整数位数不等时,在头部添零
repeat
n1:='0'+n1;
until length(n1)=length(n2);
if length(n2)<length(n1) then
repeat
n2:='0'+n2;
until length(n1)=length(n2);
end;procedure Sub;
var i,j,k:integer;
begin
n4:='';
SetLength(n4,len+5);
for i:=len downto 1 do
if n1[i]>=n2[i] then //够减
n4[i]:=chr(ord('0')+ord(n1[i])-ord(n2[i]))
else
begin //借位
n4[i]:=chr(ord('0')+10+ord(n1[i])-ord(n2[i]));
j:=i-1;
while n1[j]='0' do
begin
n1[j]:='9';
dec(j);
end;
end;
n4:=copy(n4,1,len-add)+'.'+copy(n4,len-add+1,add); {在结果串中移入小数点}
while n4[length(n4)]='0' do delete(n4,length(n4),1); {截去尾部的零}
while (n4[1]='0') and (n4[2]<>'.') do delete(n4,1,1); {截去结果串头部的零}
if n4[length(n4)]='.' then delete(n4,length(n4),1); {整数截去小数点}
end;procedure doDec;
var i:integer;
begin
DecInit;
len:=length(n1);
i:=1;
n4:='';
while (i<=len) and (n1[i]=n2[i]) do inc(i);
//按高位到低位的顺序搜索两个数中第一个数字不同的位
if i>len then n4:='0'
else
begin
if n1[i]>n2[i] then
Sub
else
begin
n3:=n1;n1:=n2;n2:=n3;
Sub;
n4:='-'+n4;
end;
end;
end;begin //主函数调用例子
n1:='3.588899';
n2:='38.588899';
doDec;
writeln(n4);
readln;
end.
解决方案 »
- richedit字符串用数学公式计算的问题
- 两个fastrpt脚本编写(报表设表)的问题
- 在局域网中,如果一个客户端更新了服务器上数据库表m中的记录后,其它客户端如何及时知道表m被更改了?服务器能自动及时发出通知信息让客户端知道吗?
- 数据匹配问题!
- NumberFormatLocal
- 哪位大侠知道IDTCPSERVER控件的多线程是怎么实现的!当它接收到一个数据后怎么判断这个数据是属于哪一个线程的!
- 请教在QREPORT里面怎样打印表格的横竖线?
- 我想查询以hp开头的字段,好像可以的,但具体怎么做忘了,谁能告诉我吗?
- 怎么让identity初始值恢复为1
- 数据库记录定位问题
- query.recordcount 总是为-1,请教!
- 在用UDP进行文件传输是应该怎么来进行文件的分解与组包?
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function InfiniteAdd(mNumberA, mNumberB: string): string; { 无限位数加法 }
var
I: Integer;
T: Integer;
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, '.'))); //小数部分最大长度
mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
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; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
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'; //处理空字符情况
end; { InfiniteAdd }function InfiniteMult(mNumberA, mNumberB: string): string; { 无限位数乘法 } function fMult(mNumber: string; mByte: Byte): string; { 无限位数乘法子函数 }
var
I: Integer;
T: Integer;
begin
Result := '';
T := 0;
for I := Length(mNumber) downto 1 do begin //从后向前扫描
T := StrToIntDef(mNumber[I], 0) * mByte + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end;
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
end; { fMult }var
I: Integer;
vDecimal: Integer; //小数位数
T: string;
begin
Result := '';
///////Begin 处理小数
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
vDecimal := Length(StrRight(mNumberA, '.')) + Length(StrRight(mNumberB, '.')); //计算小数位数
mNumberA := StrLeft(mNumberA, '.') + StrRight(mNumberA, '.'); //删除小数点
mNumberB := StrLeft(mNumberB, '.') + StrRight(mNumberB, '.'); //删除小数点
///////End 处理小数
T := '';
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 }procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text := InfiniteMult(Edit1.Text, Edit2.Text);
// Caption := FloatToStr(StrToFloatDef(Edit1.Text, 0) * StrToFloatDef(Edit2.Text, 0));
end;
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function InfiniteAdd(mNumberA, mNumberB: string): string; { 无限位数加法 }
var
I: Integer;
T: Integer;
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, '.'))); //小数部分最大长度
mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
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; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
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'; //处理空字符情况
end; { InfiniteAdd }function InfiniteMult(mNumberA, mNumberB: string): string; { 无限位数乘法 } function fMult(mNumber: string; mByte: Byte): string; { 无限位数乘法子函数 }
var
I: Integer;
T: Integer;
begin
Result := '';
T := 0;
for I := Length(mNumber) downto 1 do begin //从后向前扫描
T := StrToIntDef(mNumber[I], 0) * mByte + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end;
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
end; { fMult }var
I: Integer;
vDecimal: Integer; //小数位数
T: string;
begin
Result := '';
///////Begin 处理小数
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
vDecimal := Length(StrRight(mNumberA, '.')) + Length(StrRight(mNumberB, '.')); //计算小数位数
mNumberA := StrLeft(mNumberA, '.') + StrRight(mNumberA, '.'); //删除小数点
mNumberB := StrLeft(mNumberB, '.') + StrRight(mNumberB, '.'); //删除小数点
///////End 处理小数
T := '';
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 }procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text := InfiniteMult(Edit1.Text, Edit2.Text);
// Caption := FloatToStr(StrToFloatDef(Edit1.Text, 0) * StrToFloatDef(Edit2.Text, 0));
end;
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function InfiniteAdd(mNumberA, mNumberB: string): string; { 无限位数加法 }
var
I: Integer;
T: Integer;
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, '.'))); //小数部分最大长度
mNumberA := mNumberA + DupeString('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
mNumberB := mNumberB + DupeString('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
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; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
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'; //处理空字符情况
end; { InfiniteAdd }function InfiniteMult(mNumberA, mNumberB: string): string; { 无限位数乘法 } function fMult(mNumber: string; mByte: Byte): string; { 无限位数乘法子函数 }
var
I: Integer;
T: Integer;
begin
Result := '';
T := 0;
for I := Length(mNumber) downto 1 do begin //从后向前扫描
T := StrToIntDef(mNumber[I], 0) * mByte + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end;
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
end; { fMult }var
I: Integer;
vDecimal: Integer; //小数位数
T: string;
begin
Result := '';
///////Begin 处理小数
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
vDecimal := Length(StrRight(mNumberA, '.')) + Length(StrRight(mNumberB, '.')); //计算小数位数
mNumberA := StrLeft(mNumberA, '.') + StrRight(mNumberA, '.'); //删除小数点
mNumberB := StrLeft(mNumberB, '.') + StrRight(mNumberB, '.'); //删除小数点
///////End 处理小数
T := '';
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 }procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text := InfiniteMult(Edit1.Text, Edit2.Text);
// Caption := FloatToStr(StrToFloatDef(Edit1.Text, 0) * StrToFloatDef(Edit2.Text, 0));
end;