如何在Delphi中将整数转换为float?

时间:2010-10-14 14:43:10

标签: delphi pascal

如何在Delphi中将整数转换为float?

E.g int_h:= int_var / 1.5 * int_var;

5 个答案:

答案 0 :(得分:8)

i * 1.0应将其转换为浮点数。涉及任何类型的浮点数的任何计算都会隐式转换为extendend,然后在赋值时隐式转换为所需的结果类型。与C / C ++相反,所有计算都发生在扩展(80位浮点数,x87浮点单元的内部格式)中,并在稍后转换回来。

真实(i)也可能有用。

答案 1 :(得分:4)

整数浮动

不需要投射任何东西,只需指定

Float1 := Integer1;

您的问题似乎是Float to Integer

两个选项

Integer1 := Trunc(Float1); //truncate 

Integer1 := Round(Float1); //Round

答案 2 :(得分:2)

你可以这样做:

myFloat := myInteger;

答案 3 :(得分:1)

3种可能的方式,取决于你的表达方式。

var
  Float: Double;
  Int1: Integer;
  Int2: Integer;
begin
  Int1 := 925;
  Int2 := 21;
  Float := Int1; // simple form: assign it
  Writeln(Float);
  Float := Int2 / Int1; // floating point division: assign it
  Writeln(Float);
  Float := (1.0 * Int2) * Int1; // integer operator: multiply by 1.0 and add parenthesis
  Writeln(Float);
end.

输出:

 9.25000000000000E+0002
 2.27027027027027E-0002
 1.94250000000000E+0004

答案 4 :(得分:1)

我有这两个(我有更多,但例如就够了)oveloaded函数:

interface
   function MyFunc(Value:Integer):Integer;overload;
   function MyFunc(Value:Double):Double;overload;
implementation
   function MyFunc(Value:Integer):Integer;
   begin
        MyFunc:=Math.Ceil( {Do some extra complicated Math calcs}
                          *
                           MyFunc( {¿How to Type Cast as Double?} Value )
                         );
   end; 
   function MyFunc(Value:Double):Double;
   begin
        MyFunc:={Do some Math calcs with Value};
   end; 

如何将Typecast整数转换为Double? 我讨厌使用较少CPU时间的'(1.0 * Value)'或'(0.0 + Value)',必须以其他方式存在。

当心:我的意思是对那个电话进行类型转换! 请注意:调用是在一个重载函数上,一个调用另一个

希望有人找到一种方法,因为把'MyFunc((Double)Value)'说无效的类型转换...为什么在地狱上将一个整数转换为double是不可能的?一个double可以存储一个整数......还有更多,当它分配它时直接投射...'MyVarOfTypeDouble:= MyvarOfTypeInteger;'工作正常。

问题来自重载函数......它不知道我想调用Double版本一...这就是为什么需要演员......

换句话说......这会像魅力一样:

interface
   function MyFunc_Integer(Value:Integer):Integer;
   function MyFunc_Double(Value:Double):Double;
implementation
   function MyFunc_Integer(Value:Integer):Integer;
   begin
        MyFunc_Integer:=Math.Ceil( {Do some extra complicated Math calcs}
                                  *
                                   MyFunc_Double(Value)
                                  );
   end; 
   function MyFunc_Double(Value:Double):Double;
   begin
        MyFunc_Double:={Do some Math calcs with Value};
   end; 

看看,如果函数名称不同,则无需投射...直到我找到更好的解决方案我必须害怕我将使用'(0.0 +值)'它应该工作(但不是)'( Double)value',whe值为Integer类型。

所以我的回答是......而不是放置代码'(Double)SomethingOfTypeInteger'(应该可以工作,但编译器不喜欢它)...把这个其他代码'(0.0 + SomethingOfTypeInteger)',我确实不推荐使用'(1.0 * SomethingOfTypeInteger)',因为效率低得多......

永远不要考虑创建像这样的函数(它也比1.0 *值更差):

function ConvetIntegerToDouble(Value:Integer):Double;
begin
     ConvetIntegerToDouble:=Value;
end;

该功能符合要求......但需要花费很多时间,而不是放置'0.0 +值'。

现在非常非常......非常聪明的人...看到这个(非常难看的)代码:

    interface
       function MyFunc(Value:Integer):Integer;overload;
       function MyFunc(Value:Real48):Real48;overload;
       function MyFunc(Value:Real):Real;overload;
       function MyFunc(Value:Double):Double;overload;
       procedure CanYouGuess;
    implementation
    var
       MyVarOfTypeDouble:Double;
       function MyFunc(Value:Integer):Integer;
       begin
            MyFunc:=Round(MyFunc(1.0+Value));
       end;
       function MyFunc(Value:Real48):Real48;
       begin
            MyFunc:=MyFunc(2.0+Value);
       end;
       function MyFunc(Value:Real):Real;
       begin
            MyFunc:=MyFunc(4.0+Value);
       end;
       function MyFunc(Value:Double):Double;
       begin
            MyFunc:=(8.0+Value);
       end;
       procedure CanYouGuess;
       var
          MyVarOfTypeReal48:Real48;
          MyVarOfTypeReal:Real;
       begin
            MyVarOfTypeDouble:=MyFunc( 0 ); // What value will be on MyVarOfTypeDouble?
            MyVarOfTypeReal48:=0;
            MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal48); // What value will be on MyVarOfTypeDouble?
            MyVarOfTypeReal:=0;
            MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal); // What value will be on MyVarOfTypeDouble?
            MyVarOfTypeDouble:=MyFunc(0.0); // What value will be on MyVarOfTypeDouble?
       end;

现在尝试猜测值......阅读代码不清楚哪些调用必须去...我传递一个整数,然后在Integer oveload版本中...哪一个被调用... Real48重载或Real一个或者双人一个? ...同样适用于传递Real48并传递Real ...

编译器发现没有任何错误...但我不知道哪个(如果只有一个)将被调用...当然没有跟踪!你能吗?

对于这种情况,明确的演员阵容很棒......

请注意我把1.0 +,2.0 +,4.0 +,8.0 + ...... 2的权力......所以任何或其中任何一个的总和都可以看出...如果resoult是15 ...所有他们已经运行...如果3只有1.0和2.0等...二进制模式!像比特权重等...它只是为了表明代码如何变得太复杂......只是因为一个重载函数必须有不同的参数......

这是不允许的,因为编译器不知道要调用哪一个:

    interface
       function MyFunc(Value:Double):Integer;overload;
       function MyFunc(Value:Double):Real48;overload;
       function MyFunc(Value:Double):Real;overload;
       function MyFunc(Value:Double):Double;overload;

是的,编译器是一个非常愚蠢的...它只能在分配时使用MyFunc的情况下编译.... se此代码:

MyVarOfTypeReal48:=MyFunc(1); // It can know return value must be Real48, so call that one... but compiler is not so Intelligent

在这种情况下,可以知道要调用哪一个......问题在于:

MyVarOfTypeInteger:=Round(5*MyFunc(1)+MyFunc(2)*1.3); // This is problematic, first one could be understod as Integer version, second one as ... as what? Real, Real48 or Double? not possible to know... that is why compiler does not like such overloaded (with same arguments).

希望这有帮助!