直接看代码(运行环境Win10+XE8)
api
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; const //误差范围 由于个人常量以及变量都只有一位小数,因此误差在0.01便认为可接受 //实际误差值请根据须要自行调整 DEVIATION_GRADE = 0.01; //范围值最大值常量 Delphi默认把浮点类型常量归于 System.Extended类型 //网上说Double占用8个字节,而Extended占用10个字节,因此Extended比Double类型精度更高 VALUE_MAX_C = 4.2; //范围值最小值常量 VALUE_MIN_C = 3.9; type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var //若下面的变量定义为AValue: Extended; 则能够不使用偏差判断,直接比对便可,由于两个值精度相同 AValue: Double; begin //先把界面输入的值转换成一个Double类型变量,供后续判断使用 //虽然这个函数的名字叫TryStrToFloat,可是实际上它返回的值为System.Extended类型 //因此另一个解决办法就是把AValue定义为System.Extended类型,这样就不会出现不一致的状况 if not TryStrToFloat(Trim(Edit1.Text), AValue) then begin Memo1.Lines.Add('转换失败'); Exit; end; //若界面的值输入的为3.9或4.2,则直接比对时会致使比对失败 if (AValue >= VALUE_MIN_C) and (AValue <= VALUE_MAX_C) then Memo1.Lines.Add('直接比对 between 3.9 and 4.2') else Memo1.Lines.Add('直接比对失败'); //界面的值输入为3.9时,咱们认为它应该>=常量3.9,但实际这个判断返回的是false if (AValue >= VALUE_MIN_C) then Memo1.Lines.Add('直接比对 AValue >= VALUE_MIN_C'); if (AValue <= VALUE_MAX_C) then Memo1.Lines.Add('直接比对 AValue <= VALUE_MAX_C'); //使用允差比对就能够解决上面的问题 //当变量值为3.9时,常量3.9-偏差0.01=3.89,条件AValue > VALUE_MIN_C - DEVIATION_GRADE成立 //当变量值为4.2时,变量值4.2-偏差0.01=4.19,条件AValue - DEVIATION_GRADE <= VALUE_MAC_C成立 if (AValue >= VALUE_MIN_C - DEVIATION_GRADE) and (AValue - DEVIATION_GRADE <= VALUE_MAX_C) then Memo1.Lines.Add('误差比对 between 3.9 and 4.2') else Memo1.Lines.Add('误差比对失败'); end; end.
窗体文件函数
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 242 ClientWidth = 527 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 200 Top = 24 Width = 169 Height = 129 Lines.Strings = ( 'Memo1') TabOrder = 0 end object Edit1: TEdit Left = 48 Top = 32 Width = 121 Height = 21 TabOrder = 1 Text = '4.2' end object Button1: TButton Left = 200 Top = 168 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 2 OnClick = Button1Click end end
究其缘由,应该是由于Double类型与Extended在内存中表示的方式不一致致使,因此解决办法有两个:工具
把变量改为和系统常量相同的类型,即把变量定义为Extended类型调试
使用合理的偏差值计算结果,一样能够避免该问题
code
PS:不知道各位大神谁会使用Delphi的调试工具呀?能不能在运行时看看常量以及变量的值再内存中是如何表示的?既然他们不一样,那么不一样处在哪儿?求解答!!!orm