注意:此问题已被编辑,因为我的问题变得完全不同了。您将在MBo's answer中找到问题What's the keyword for the maximal value for a floating point type?
的直接答案 - 使用System.Math的常量。
Delphi提供多种浮点值类型。 开始时有Single,Double和Extended。
上周我查找了关键字的最大浮点值,发现了这个:http://www.delphibasics.co.uk/RTL.asp?Name=Infinity
var
float1, float2 : single;
begin
float1 := Infinity;
float2 := 23;
ShowMessage('float1 = '+FloatToStr(float1));
ShowMessage('float2 = '+FloatToStr(float2));
ShowMessage('float1 - float2 = '+FloatToStr(float1 - float2));
ShowMessage('-float1 = '+FloatToStr(-float1));
end;
假设输出
float1 = INF
float2 = 23
float1 - float2 = INF
-float1 = -INF
我有一个包含组件的表单。该组件有几个属性。
如果我使用属性编辑器将Infinity
作为浮点属性的值,我会得到错误,它是一个无效的浮点值。同样适用于INF
。
然后我在MaxValue字段中输入9.9E308
。它转变为INF
。
对此感到相当高兴,我保存了表格并继续我的工作。我在当天晚些时候编译了表单,成功测试了表单的值是否为1E308
。
第二天......
在记事本中打开.dfm文件给我这个:
object gridDoubleEditor: TdgmrGridDoubleEdit
Tag = 0
WantKeyLeftRight = False
WantKeyUpDown = False
WantKeyHomeEnd = False
WantKeyPriorNext = False
EmptyString = '--'
EmptyValue = -1E300
MinValue = -1E300
MaxValue = INF
NumberOfDecimals = 2
Alignment = taRightJustify
Left = 336
Top = 208
end
为什么它会自动将9.9E308
更改为INF,成功编译,成功保存,但无法加载?这是我的IDE中的错误吗?我在Windows 7上使用Embarcadero®Delphi®XE5版本19.0.14356.6604,32位。
答案 0 :(得分:5)
System.Math单元包含Infinity
常量,表示IEEE754 Inf伪值(1.0 / 0.0)。此单元中还有很多MaxDouble,MaxExtended等常量(请查看Variables section here)。这个简短的测试可以根据需要进行,所以我怀疑你的组件可能会进行某种范围检查,或者让属性编辑器不了解未知的标识符。
TTest = class(TComponent)
private
FValue: Double;
procedure SetValue(const Value: Double);
public
property Value: Double read FValue write SetValue;
end;
procedure TForm1.Button26Click(Sender: TObject);
begin
with TTest.Create(Self) do try
Value := Infinity;
Caption := FloatToStr(Value);
finally
Free;
end;
end;
P.S。您是否需要使用Infinity作为字段值,或者只是为了确保字段值> -1E300?
<强> P.P.S。强> 你为什么还在使用INF,而不是Infinity? 顺便说一句,我发现一个组件有浮动发布的属性 - 对象检查器不了解无限 - 所以属性编辑器不是为这些目的设计的,因为我已经想到了,但我可以在代码中指定无限。