作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
uses
SysUtils, Variants;
var
VariantSingle: Variant;
VTSingle: TVarType;
SingleTest: Single;
VariantDouble: Variant;
DoubleTest: Double;
VTDouble: TVarType;
begin
SingleTest := 1.234;
VariantSingle := SingleTest;
VTSingle := VarType(VariantSingle) and varTypeMask;
DoubleTest := 1.23456;
VariantDouble := DoubleTest;
VTDouble := VarType(VariantDouble) and varTypeMask;
WriteLn(Format('VarType: Single: %d, Double %d', [VTSingle, VTDouble]));
end.
上面的代码将输出:
VarType: Single: 5, Double 5
来自 System.pas
varSingle = $0004; { vt_r4 4 }
varDouble = $0005; { vt_r8 5 }
因此,我希望 VTSingle 为 4 - 而不是 5
我错过了什么?
最佳答案
Delphi 库选择通过调用_VarFromReal
来实现对变体的所有浮点赋值。该函数如下所示:
procedure _VarFromReal(var V: TVarData; const Value: Real);
begin
if (V.VType and varDeepData) <> 0 then
VarClearDeep(V);
V.VType := varDouble;
V.VDouble := Value;
end;
请注意,这使用了 varDouble
类型。并包括到 Real
的隐式转换,这是 Double
的别名。我不确定设计师为什么选择这条特定路线,但该选择的结果就是您观察到的行为。
制作您可以使用的 varSingle
变体的简单方法:
VariantSingle := VarAsType(SingleTest, varSingle);
尽管这会将 SingleTest
转换为 Double
,然后再转换回 Single
。
为了避免不必要的转换,请编写自己的帮助程序:
function VarFromSingle(const Value: Single): Variant;
begin
VarClear(Result);
TVarData(Result).VSingle := Value;
TVarData(Result).VType := varSingle;
end;
你可以这样调用:
VariantSingle := VarFromSingle(SingleTest);
我认为后一种方法是正确的解决方案。
关于delphi - 为什么将 single 分配给变体会产生 varDouble 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133496/
uses SysUtils, Variants; var VariantSingle: Variant; VTSingle: TVarType; SingleTest: Single;
我是一名优秀的程序员,十分优秀!