200分的问题,进来看看呀,没准你能全部拿走呢!(200分)

  • 主题发起人 主题发起人 sailer_shi
  • 开始时间 开始时间
S

sailer_shi

Unregistered / Unconfirmed
GUEST, unregistred user!
1.怎么将先四舍五入后在相加和先相加在四舍五入之间的误差去掉?
2.Delphi对Word的操作,给出例子(要有详细的注释的),为什么我在向word中添加东西的时候在最前面总是出现一些不知道从那里冒出来的咚咚,为什么?
 
1:分析一下
如果a、b都小于0.5 并且其和大于等于0.5则先四舍五入少1
如果a、b都大于等于0.5 并且其和小于0.5则先四舍五入多1
其他情况一致
所有只要单独处理前两种情况就可以了
 
1、关于四舍五入
BORLAND的ROUND函数只能取整,而且是统计学上的四舍五入(奇数进,偶数不进),
应用中很不方便,大家提出了很多解决方案,综合起来主要有以下几种:
1.先换算成整数再用round处理,再换算回原来的数据
存在问题:round的取整算法和常用的不一样
2.先换算成整数再+0.5,再用INT处理,再换算回原来的数据
存在问题:很多人编写的函数没有处理负数
3.用FORMATFLOAT函数处理
存在问题:一般的数据均能处理,也是很多人认为的正确的答案,
但如果处理的是运算结果,因运算结果是浮点数,可能存在误差,则结果就不对.
例:显示是1.085,但运算结果可能是1.08499999,则取两位小数的结果为1.08

在总结上述错误,参观论坛上各高手的论述,我提出我的终极四舍五入函数,
我认为是全面的,但可能还有错误,或有更简单的算法,欢迎大家批评指教!

function RoundFloat(f:double;i:integer):double;
var
s:string;
ef:extended;
begin
s:='#.'+StringOfChar('0',i);
ef:=StrToFloat(FloatToStr(f));//防止浮点运算的误差
result:=StrToFloat(FormatFloat(s,ef));
end;

上面函数有问题(在取整并且结果为0的时候出错),现修正如下:
function RoundFloat(f:double;i:integer):double;
var
s:string;
ef:extended;
SValue: string;
begin
s:='#.'+StringOfChar('0',i);
ef:=StrToFloat(FloatToStr(f));//防止浮点运算的误差
SValue := FormatFloat(s,ef);
if SValue <> '' then
result := StrToFloat(SValue)
else
result := 0;
end;
2、关于WORD的操作
http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517
Delphi与Word之间的融合技术
 
//写一个过程,这是将表导出到WORD

//Msgconfim()为一个MessageDLG Function


procedure ExportData(FA:TDataSet);//数据集类型,可以是TQuery/TTable 组件
var i:integer;
ex:Variant;
str:string;
dialog:TsaveDiaLog;
openlog:TopenDiaLog;
openlog.Title:='请打开一个 word 文档!';
dialog.Filter:='Word(*.doc)|*.doc';
openlog.Filter:='Word(*.doc)|*.doc';
if MsgConfim('真的要导出到WORD文档吗?请确定您的系统安装了 "Microsoft Word Application" ?',0) then
begin
try
Screen.Cursor:=CrSQLwait;
ex:=CreateOleObject('word.application');
ex.visible:=False;
except
Screen.Cursor:=Crdefault;
Msgconfim('您的系统没有安装 "Microsoft Word Application" !',1);
exit;
end;
try
if openlog.Execute then
begin
ex.documents.open(openlog.FileName);
FA.Last;
while Not FA.Bof do
begin
for i:=FA.FieldCount-1 downto 0 do
ex.selection.Range:=FA.Fields.AsString+spac+' ';
ex.selection.Range:=#13;
FA.Prior;
end;
For i:=FA.FieldCount-1 downto 0 do
ex.selection.Range:=FA.Fields.FieldName+spac+' ';
ex.Activedocument.Range.font.size:=8;
ex.activedocument.Range.font.color:=clblue;
ex.Activedocument.Range.font.Bold:=True;
ex.selection.Range:=' '+tit+#13;
if dialog.Execute then
ex.Activedocument.saveas(CheckFilename(dialog.FileName,'.doc'));
ex.Activedocument.Saved:=true;
ex.Activedocument.Close;
ex.quit;
ex:=Unassigned;
Screen.Cursor:=Crdefault;
Msgconfim('导出 Word 文档成功!',1) ;
end;
except
Screen.Cursor:=Crdefault;
Msgconfim('导出 Word 文档失败!',1) ;
ex.Activedocument.Close;
ex.quit;
ex:=Unassigned;
end;
end;
end;
 
非常关注四舍五入的问题~!
 
SimpleRoundTo
 
function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double;
var
LFactor: Double;
begin
LFactor := IntPower(10, ADigit);
Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;

delphi 的 math 的函数
 
后退
顶部