如何在delphi中比较double?

如何在delphi中比较double?,delphi,types,Delphi,Types,我们面临数据类型双重比较的问题: if(p > pmax) then begin Showmessage(''); end 如果这两个值都是100(p=100和pmax=100),那么它也会进入If子句。比较双精度有几个问题。一个问题是,由于四舍五入,你看到的并不完全是你得到的。可以将99.99999996423和100.00000000001632四舍五入为100,但它们并不相等 解决方法是使用一个边距,这样,如果两个双精度的差值在边距内,您可以接受它们相等 您可以使用边距作为可选

我们面临数据类型双重比较的问题:

if(p > pmax) then
begin
  Showmessage('');
end

如果这两个值都是100(p=100和pmax=100),那么它也会进入If子句。

比较双精度有几个问题。一个问题是,由于四舍五入,你看到的并不完全是你得到的。可以将99.99999996423和100.00000000001632四舍五入为100,但它们并不相等

解决方法是使用一个边距,这样,如果两个双精度的差值在边距内,您可以接受它们相等

您可以使用边距作为可选参数来创建等质量函数:

function IsEqual(const ANumber1, ANumber2: Double; const AMargin: Double = cMargin): Boolean;
begin
  Result := Abs(ANumber1-ANumber2) <= AMargin;
end;
函数IsEqual(常量ANumber1,ANumber2:Double;常量AMargin:Double=cMargin):布尔;
开始

结果:=Abs(ANumber1-ANumber2)Math.pas单元包括处理浮点类型比较和相等的函数,如
SameValue()
IsZero()
CompareValue()

const
  EPSILON = 0.0000001;
begin    
  if CompareValue(p, pMax, EPSILON) = GreaterThanValue then
    ShowMessage('p greater than pMax');
常量
GreaterThanValue
在Types.pas中定义

如果要比较非常大的值则不应使用常数表示ε,而应根据要比较的值计算ε值

var
  epsilon: double;
begin    
  epsilon := Max(Min(Abs(p), Abs(pMax)) * 0.000001, 0.000001);
  if CompareValue(p, pMax, epsilon) = GreaterThanValue then
    ShowMessage('p greater than pMax');
请注意,如果您使用
CompareValue(a,b,0)
或在XE2和更高版本中使用
CompareValue(a,b)
,Delphi将自动为您填写一个好的ε

来自德尔福
数学
单元:

function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
  if Epsilon = 0 then
    Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
  if A > B then
    Result := (A - B) <= Epsilon
  else
    Result := (B - A) <= Epsilon;
end;
函数SameValue(常数A,B:扩展;ε:扩展):布尔;
开始
如果ε=0,则
ε:=Max(Min(Abs(A),Abs(B))*扩展分辨率,扩展分辨率);
如果A>B,那么

结果:=(A-B)非常感谢..看起来很有效..昨天我尝试了这个,但不知道类型。pas..-100因为使用了固定的epsilon值,我编辑了答案来解决这个问题。我相信,如果有人使用固定的epsilon并导致他们出现问题,他们的问题不是Epsilon,而是Double/Extended不再精确到足以满足他们的需求。就个人而言,我会在工作中继续使用Epsilon的固定值。一旦我使用的扩展变量的值达到一个可以超过0.005美元的值,Epsilon将是我最后关心的问题。@Johan:-100如果我可以编辑更改的内容。如果你不同意答案,发表你自己的观点,并对你认为错误的人投反对票。如果语法或格式有更改,请编辑。如果你不同意这个答案,就投反对票。把它改成不同的意思不是编辑的方式。我觉得永远都不会太强烈。如果你知道你的数据总是在一个固定的范围内,为什么每次计算都要增加重新计算ε的开销呢。计算一次合适的ε,然后使你的ε为常数。@Simon:有一个德国网站<代码>没有if循环,但只有if语句