Delphiで整数をfloatに変換する方法は?
例:int_h:= int_var/1.5 * int_var;
i * 1.0は、それを浮動小数点数に変換する必要があります。任意のタイプの浮動小数点数を含む計算は、暗黙的にextendend
に変換され、割り当て時に目的の結果タイプに暗黙的に変換されます。 C/C++とは対照的に、すべての計算はExtended(80ビット浮動小数点、x87浮動小数点ユニットの内部フォーマット)で行われ、後で変換されます。
real(i)も機能する可能性があります。
浮動小数点への整数
何もキャストする必要はありません。割り当てるだけです。
Float1 := Integer1;
あなたの質問はFloattoIntegerのようです
2つのオプション
Integer1 := Trunc(Float1); //truncate
または
Integer1 := Round(Float1); //Round
できるよ:
myFloat := myInteger;
私はこの2つを持っています(私はもっと持っていますが、例えば十分でしょう)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 IntegerをDoubleにするにはどうすればよいですか? CPU時間をあまり使用しない「(1.0 * Value)」または「(0.0 + Value)」を配置するのは嫌いですが、それを行うには他の方法が必要です。
注意:私はその呼び出しでタイプキャストを意味します!!!注意:呼び出しはオーバーロードされた関数で行われ、一方が他方を呼び出します
誰かが方法を見つけて、「MyFunc((Double)Value)」を置くと無効なタイプキャストが表示されることを願っています...なぜ地獄で整数をdoubleにキャストできないのですか???? doubleは整数を格納できます...さらに、それを直接キャストするように割り当てると...´MyVarOfTypeDouble:= MyvarOfTypeInteger; ´は完璧に機能します。
問題はオーバーロードされた関数にあります... Doubleバージョン1を呼び出したいのかわかりません...それがキャストが必要な理由です...
言い換えれば...これは魅力のように機能します:
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 + Value)」を使用することを恐れる必要があります(ただし、機能しない)「(Double)value」 ´、whe値は整数型です。
だから私の応答は...コード ´(Double)SomethingOfTypeInteger´を置く代わりに(それは動作するはずですが、コンパイラはそれを好きではありません)...この他のコード´(0.0 + SomethingOfTypeInteger) ´を置く、私は´( 1.0 * SomethingOfTypeInteger) ´は効率がはるかに低いため...
このような関数を作成することを考えたことはありません(1.0 * Valueよりも最悪です):
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;
今度は値を推測してみてください...コードを読んで、どの呼び出しを実行する必要があるかが明確ではありません...整数を渡し、次に整数oveloadバージョン内で...どちらが呼び出されますか... ...同じことがReal48の受け渡しとRealの受け渡しにも当てはまります...
コンパイラはエラーをまったく検出しませんでした...しかし、どちらが呼び出されるか(1つだけの場合)はわかりません...もちろん、トレースせずに!!!あなたはできる?
そのような状況では、明示的なキャストが機能するのが素晴らしいでしょう...
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が割り当てで使用される場合にのみコンパイルできます...次のコードを参照してください。
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).
お役に立てれば!
あなたが持っている表現の種類に応じて、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