Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何最好地将整数转换为浮点值而不指定变量?_Delphi - Fatal编程技术网

Delphi 如何最好地将整数转换为浮点值而不指定变量?

Delphi 如何最好地将整数转换为浮点值而不指定变量?,delphi,Delphi,我想知道如何从整数转换为浮点值,而不必指定中间变量。所讨论的代码如下所示: Format('Theoretical peak scaling %6.2f', [ThreadCount]) Format('Theoretical peak scaling %3d.00', [ThreadCount]) 这显然在运行时失败,因为ThreadCount是一个整数 我试过显而易见的方法 Format('Theoretical peak scaling %6.2f', [Double(ThreadCo

我想知道如何从整数转换为浮点值,而不必指定中间变量。所讨论的代码如下所示:

Format('Theoretical peak scaling %6.2f', [ThreadCount])
Format('Theoretical peak scaling %3d.00', [ThreadCount])
这显然在运行时失败,因为
ThreadCount
是一个整数

我试过显而易见的方法

Format('Theoretical peak scaling %6.2f', [Double(ThreadCount)])
而编译器拒绝使用

E2089 Invalid typecast
我知道我会写作

Format('Theoretical peak scaling %6.2f', [ThreadCount*1.0])
但这读起来很糟糕,只会吸引未来的维护人员删除错误的乘法运算


是否有人知道一种不使用中间变量的干净方法,并且可以让未来的读者清楚代码的意图?

您不能使用一个简单的函数:

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


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

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

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

这可能感觉很傻。。。但如果它是一个整数,为什么不:

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

小数点后除了0之外,你什么都不会有,对吗?

你也可以这样做:

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

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

对于内部类型,您可以选择使用
记录帮助程序

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内部使用

引用马可·坎图的话:

  • 我们建议您不要自己写(尽管您可能希望这样做) 作为我们不支持的类型的临时措施)

  • 原因不仅仅是每个类有一个助手规则,还有 这种行为将来会发生变化,使用不同的编译器机制。 因此,如果你为此付出了代价,不要对未来屏息以待

参考文献:

Update:In是一个内置的整数辅助类,它有一个方法
ToDouble


使用
RTTI
可以通过内置语言元素像这样解决:

Format('Theoretical peak scaling %6.2f', 
  [TValue.From<Integer>(ThreadCount).AsExtended])
格式(“理论峰值缩放%6.2f”,
[TValue.From(ThreadCount).AsExtended])



就FTR而言,一个基准测试表明,
Double(Variant(i))
和内联helper
i.AsFloat
是可比的,而
TValue.From(i).扩展的
则慢200多倍

好奇的是,你为什么不想使用一个变量?@Toon,因为我得给它命名。现在我得到了两个本地变量,它们的名称和值基本相同。没有变量,代码读起来会更好。我更喜欢使用中间值。如果列表变得太长,则是拆分函数的时候了。但是命名问题也值得考虑。FWIW,乘以1.0是一个由来已久的产生浮点值的习惯用法,任何删除冗余代码的人都应该被解雇。在我看来,这种情况下真正的问题不是类型转换,而是%f和%n只是除了浮点值和拒绝序数值之外。嗯,这当然是一个干净的方法。我希望能在语言或RTL中嵌入一些东西。没有这样的事情似乎令人惊讶。在类型之间转换是一项非常基本的任务。在兼容的类型之间转换不需要代码,因此使用类型转换告诉编译器您希望这样做很简单。但是在不兼容类型之间转换需要运行时支持来完成繁重的工作。当显式转换与实际发生的情况一样高效和清晰时,为什么还要用自动隐藏转换来加重语言的负担呢?变体已经证明(Delphi)用户不喜欢自动隐藏数据转换。@dthorpe我不想要自动隐藏转换。我想我需要一个显式转换。但我找不到。@d尽管它是显式的。它是一个显式乘法。不是显式转换。@DavidHeffernan:我使用“+0.0”而不是“*1.0”,但正如你所说,这不是显式转换。我也是。。。我永远不会使用它。我会使用
+0.0
-通常加法比乘法容易:-D@DavidHeffernan-你知道,你总是可以把
1.0
变成一个类型化常量(称之为
const 1.0=INT_TO_FLOAT
和do
ThreadCount*INT_TO_FLOAT
。这可能会给简单的idomatic方法增加一点优雅?该死。我需要更快地键入。:PYeah,这解决了这个问题,但它实际上并没有转换为FLOAT。在其他情况下,我会想象我想要转换。@DavidHeffernan…其他情况?@DavidHeffernan我在思考什么是“其他情况”时遇到问题。从整数到浮点的转换通常是自动的。在这种情况下,格式字符串在运行时被解析,因此编译器无法进行调整。@标记另一种情况:添加1000个分隔符,例如
format('Generate%.0n numbers in%.0n msec',[Count,Ticks])
Nice。我立即想到了.NET扩展方法,但我不知道Delphi有这个功能…仅限XE3+,看起来像?是的,仅限XE3,但有一些限制。我将补充答案。啊,是的,我很清楚那些论坛线程。Veltology教会的声明。帮助函数语法是在Delphi中为.N引入的ET于2003年发布。在Delphi 2005发行版中,语法可能已经转移到Win32编译器中,但我不确定。@dthorpe、记录帮助程序和类帮助程序是在Delphi-2005中添加的,但上一次为内部类型添加记录帮助程序是在XE3中添加的。这是引入根类型的一个举措。