请教,delphi中的strtofloat函数转换的错误. (150分)

  • 主题发起人 主题发起人 954ken
  • 开始时间 开始时间
9

954ken

Unregistered / Unconfirmed
GUEST, unregistred user!
STRTOFLOAT这个函数在转换时似乎不能精确转换,例如将
1转换为0.999999999999
等等,这样我在一些包含STRTOFLOAT函数的计算中经常会发生四舍五入的错误.
(由于多步运算导致最终结果与真实结果差了一位)
请教这种情况各位高手该如何解决?
(我已经试过在对各个中间结果进行四舍五入,但是仍然会出现这种情况)

btw:delphi是否有自己的四舍五入函数
 
避免浮点数四舍五入造成的误差,需要自己设置精度!
试试下面的代码!就可以较好的解决这个问题!
var
ESBTolerance: Extended = 0.00000001
//设定所要的精确度

function SameFloat (const X1, X2: Extended): Boolean;
begin
Result := abs (X1 - X2) < ESBTolerance
end;

function FloatIsZero (const X: Extended): Boolean;
begin
Result := abs (X) < ESBTolerance
end;

function FloatIsPositive (const X: Extended): Boolean;
begin
Result := (X >= ESBTolerance);
end;

function FloatIsNegative (const X: Extended): Boolean;
begin
Result := (X <= -ESBTolerance);
end;
 
Round 四舍五入
Trunc 取整
 
浮点运算的确如此,可用strtocurr函数
 
如下代码:
edit1.text:=2250;
edit2.text:=8.2891;
S:=strtofloat(edit1.text)*strtofloat(edit2.text)*100+0.5;
S1:=int(strtofloat(edit1.text)*strtofloat(edit2.text)*100+0.5);
showmessage(floattostr(S));
showmessage(floattostr(S1));
结果S=1865048 S1=1865047

请教是什么原因?int(1865048)=1865047??????
 
因为保留的精度不够!
举个例子:
用电脑使用4位数字,那么: 1 / 3 = 0.3333
我们知道3 * 1/3 = 1,但如果我们这样:
X := 1 / 3;
X := X * 3;
if X = 1 then //结果将会不正确
为什么?因为X = 0.9999而不是1。
电脑不会有无限的小数位。从Single到Double到Extended ,浮点类型可以给你更好的精确度,
但是上述的四舍五入错误依然存在。
 
S1取整把尾巴0.0091已经截去了!当然会有误差!
 
我只是做一个简单的金额*汇率的运算,要求结果四舍五入到小数点后两位.
就这样dephi都不能圆满完成?
ai......
 
呵呵!话可不是这么说!关键是用工具的人!
 
我并不是说delphi不好,我只是觉得如此小的一个运算,还需要我写上一串代码来保证它的
正确性.是否太麻烦了呢?如程序中有大量的运算该怎么办呢?

btw:s1取整时并不是将0.0091截去,而是将2250*8.2891*100+0.5的尾巴截去.
也许我写的太乱,你没看清.
 
多人接受答案了。
 
后退
顶部