5

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

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

但这读起来很糟糕,只会诱使未来的维护者删除错误的乘法。

有没有人知道没有中间变量的干净方法,并且可以使代码意图对未来的读者清楚?

4

5 回答 5

9

这可能感觉很愚蠢......但如果它是一个整数,为什么不只是:

Format('Theoretical peak scaling %3d.00', [ThreadCount]);

小数点后除了零之外,你永远不会有任何东西,对吧?

于 2013-04-17T19:50:23.573 回答
5

您可以选择将 arecord 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 倍以上。

于 2013-04-17T20:54:59.827 回答
4

这是学术性的,我会使用函数或 * 1.0 但这有效

Format('Theoretical peak scaling %6.2f', [Double(Variant(ThreadCount))])
于 2013-04-17T19:41:37.923 回答
3

你不能使用一个简单的功能:

function IntToDouble(const AInt: Integer): Double;
begin
  Result := AInt;
end;


Format('Theoretical peak scaling %6.2f', [IntToDouble(ThreadCount)]);
于 2013-04-17T19:34:54.420 回答
3

你也可以这样做:

Format('Theoretical peak scaling %3d.00', [ThreadCount])

整数 ThreadCount 永远不会有任何小数部分,因此将小数零放在字符串中并将数据作为整数同样准确。;>

于 2013-04-17T19:54:38.653 回答