delphi 如何最好地将整数转换为浮点值而不将其赋值给变量?

snz8szmq  于 2022-11-23  发布在  其他
关注(0)|答案(6)|浏览(174)

我想知道如何将整数值转换为浮点值,而不给中间变量赋值。代码如下:

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

但是这样读起来很糟糕,并且只会诱使将来的维护人员删 debugging 误的乘法。
有没有人知道一个干净的方法来做到这一点,没有一个中间变量,并在方式,使代码的意图清楚地为未来的读者?

2g32fytz

2g32fytz1#

这可能有点傻......但如果它是一个整数,为什么不直接:

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

小数点后面除了零什么都不会有,对吧?

ki1q1bka

ki1q1bka2#

对于内部类型,您可以选择使用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中,整数的内置helper类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多倍。

6ie5vjzr

6ie5vjzr3#

这是学术性的,我会使用一个函数或 * 1.0,但这是可行的

Format('Theoretical peak scaling %6.2f', [Double(Variant(ThreadCount))])
iyfjxgzm

iyfjxgzm4#

你就不能用一个简单的函数:

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

Format('Theoretical peak scaling %6.2f', [IntToDouble(ThreadCount)]);
ecfsfe2w

ecfsfe2w5#

你也可以这样做:

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

Integer ThreadCount永远不会有小数部分,所以将小数部分的零放在字符串中并将数据作为整数来处理也同样准确。〉

drkbr07n

drkbr07n6#

您可以使用整数类型提供的ToExtended函数

Format('Theoretical peak scaling %6.2f', [ThreadCount.ToExtended])

相关问题