- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
Single, Double 和 Extended 型的浮点变量存在著四捨五入問題。
举个例子,假设我们用电脑使用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 ,浮点类型可以给你更好的精确度,但是上述的四舍五入错误依然存在。
不要再作相等比较了,我们需要确定要多精确才够。
用下面的例程实现:- 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;
複製代碼 |
|