如何在不分配变量的情况下将整数转换为浮点值?

时间:2013-04-17 19:28:25

标签: delphi

我想知道如何从整数转换为浮点值,而不分配给中间变量。有问题的代码如下所示:

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])

但是读得很差,并且只是诱惑未来的维护者去除错误的乘法。

有没有人知道在没有中间变量的情况下采用干净的方法做到这一点,以及让未来读者明白代码的方式?

5 个答案:

答案 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;