我想知道如何从整数转换为浮点值,而不分配给中间变量。有问题的代码如下所示:
Format('Theoretical peak scaling %6.2f', [ThreadCount])
这显然在运行时失败,因为ThreadCount
是一个整数。
我试过了明显的
Format('Theoretical peak scaling %6.2f', [Double(ThreadCount)])
,编译器用
拒绝E2089 Invalid typecast
我知道我可以写
Format('Theoretical peak scaling %6.2f', [ThreadCount*1.0])
但是读得很差,并且只是诱惑未来的维护者去除错误的乘法。
有没有人知道在没有中间变量的情况下采用干净的方法做到这一点,以及让未来读者明白代码的方式?
答案 0 :(得分:8)
这可能感觉很傻......但如果它是一个整数,为什么不只是:
Format('Theoretical peak scaling %3d.00', [ThreadCount]);
在小数点后,你不会有除零之外的任何东西,对吗?
答案 1 :(得分:5)
您可以选择使用record helper
作为内在类型:
type
TIntHelper = record helper for Integer
function AsFloat : Double;
end;
function TIntHelper.AsFloat: Double;
begin
Result := Self;
end;
Format('Theoretical peak scaling %6.2f', [ThreadCount.AsFloat])
这是在XE3中添加的,但有一些来自Embarcadero的限制。 由于只有一个助手可以在范围内,Emarcadero建议此功能仅供RTL内部使用。
Marco Cantu引用:
我们建议不要自己写(虽然你可能想这样做 作为我们不支持的类型的临时措施)
原因不仅仅是每个类规则的一个助手,还有那个 这种行为在未来会发生变化,具有不同的编译机制。 所以,如果你有这个,不要为将来屏住呼吸。
参考:On Record/Class/Type Helpers
。
更新:在XE4
中,整数的内置辅助类TIntegerHelper
的方法为ToDouble
。
使用RTTI
可以使用内置语言元素解决这个问题:
Format('Theoretical peak scaling %6.2f',
[TValue.From<Integer>(ThreadCount).AsExtended])
只是FTR,基准测试显示Double(Variant(i))
和内联帮助i.AsFloat
具有可比性,而TValue.From<Integer>(i).AsExtended
则慢200倍。
答案 2 :(得分:4)
这是学术性的,我会使用一个函数或* 1.0,但这可行
Format('Theoretical peak scaling %6.2f', [Double(Variant(ThreadCount))])
答案 3 :(得分:3)
你不能使用一个简单的功能:
function IntToDouble(const AInt: Integer): Double;
begin
Result := AInt;
end;
Format('Theoretical peak scaling %6.2f', [IntToDouble(ThreadCount)]);
答案 4 :(得分:3)
您也可以这样做:
Format('Theoretical peak scaling %3d.00', [ThreadCount])
整数ThreadCount永远不会有任何小数部分,因此将小数零放在字符串中并将数据作为整数也同样准确。 ;&GT;