Jak przekonwertować liczbę całkowitą na zmienną w Delphi?Jak przekonwertować liczbę całkowitą na zmienną w Delphi?
E.g int_h: = int_var/1.5 * int_var;
Jak przekonwertować liczbę całkowitą na zmienną w Delphi?Jak przekonwertować liczbę całkowitą na zmienną w Delphi?
E.g int_h: = int_var/1.5 * int_var;
i * 1.0 powinien przekonwertować go na liczbę zmiennoprzecinkową. Wszelkie obliczenia z liczbami zmiennoprzecinkowymi dowolnego typu są niejawnie konwertowane na extendend
, a następnie niejawnie przekształcane na pożądany typ wyniku podczas przypisywania. W przeciwieństwie do C/C++ wszystkie obliczenia występują w rozszerzeniu (80-bitowy zmiennoprzecinkowy, wewnętrzny format jednostki zmiennoprzecinkowej x87) i są później przekształcane.
prawdziwy (i) może również działać.
Chciałbym to na odwrót. – Aftershock
można zrobić:
myFloat := myInteger;
Ta typografia jest nieprawidłowa: E2089 Nieprawidłowy typ danych. –
3 możliwe sposoby, w zależności od rodzaju wyrażeń masz.
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.
wyjściowa:
9.25000000000000E+0002
2.27027027027027E-0002
1.94250000000000E+0004
Najpierw a +1, a następnie -1; Chciałbym motywacji dla obu: pomaga mi pisać lepsze odpowiedzi. –
Integer na Float
Nie ma potrzeby, aby rzucić wszystko, po prostu przypisać
Float1 := Integer1;
swoje pytanie wydaje się być Float na Integer
Dwie opcje
Integer1 := Trunc(Float1); //truncate
lub
Integer1 := Round(Float1); //Round
Przeciwieństwem Trunc() jest faktycznie Ceil(). Trunc() zaokrągli w kierunku zera, Ceil() zaokrągli albo w stronę + nieskończoności (jeśli jest liczbą dodatnią), albo - nieskończoności (jeśli jest ujemna). – Trinidad
Żaden Ceil zawsze będzie zaokrąglał się do + inf, Podłoga zawsze będzie zaokrąglana do -inf, a Trunc zawsze do 0. Więc przeciwieństwem Ceil() nie jest Trunc, ale Piętro. – CodesInChaos
Tak, masz rację =) Przepraszamy. – Trinidad
mam to dwa (mam więcej, ale na przykład byłby wystarczający) oveloaded funkcje:
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;
Jak można w typecast Integer na osobowy ? Nienawidzę wkładania "(1,0 * Wartość)" lub "(0.0 + Wartość)", który zużywa mniej czasu procesora, musi istnieć inny sposób, aby to zrobić.
UWAGA: mam na myśli typecast na tym telefonie !!! UWAGA: połączenie jest na przeciążonej funkcji, jeden nazywa druga
nadzieję, że ktoś znajdzie sposób, bo oddanie'MyFunc ((double) wartość) mówi nieważne typecast ... dlaczego w piekle oddające liczbę całkowitą podwójne nie jest możliwe ???? double może przechowywać liczbę całkowitą ... także więcej, gdy przypisując ją, rzutuje ją bezpośrednio ...'MyVarOfTypeDouble: = MyvarOfTypeInteger; 'działa idealnie.
Problemem jest wyposażony w funkcje przeciążenia ... nie wiem chcę zadzwonić do podwójnego wersji jednej ... dlatego potrzebna jest obsada ...
Innymi słowy będzie to ... działa jak czar:
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;
See, jeśli funkcje nazwy są różne, nie ma potrzeby, aby rzucić ... aż znalazłem lepsze rozwiązanie muszę się obawiać, że będę używać "(0,0 + Value)", gdzie powinien działać (ale nie) "(Double) value", whe Wartość jest typu Integer.
Moja odpowiedź brzmi ...zamiast umieszczać kod "(Double) SomethingOfTypeInteger' (to powinno działać, ale kompilator go nie lubi) ... umieścić ten inny kod" (0.0 + SomethingOfTypeInteger) ", nie polecam używać" (1.0 * SomethingOfTypeInteger) ", ponieważ jest znacznie mniej wydajny ...
kiedykolwiek Nigdy nie myśleć o tworzeniu funkcję jak ten (jest to również najgorszy niż 1,0 * wartość):
function ConvetIntegerToDouble(Value:Integer):Double;
begin
ConvetIntegerToDouble:=Value;
end;
funkcja ta jest zgodna super ... ale zajmuje dużo , dużo więcej czasu niż wprowadzenie wartości "0.0 + wartość".
teraz bardzo, bardzo ... dużo bardzo inteligentni ludzie ... zobacz to (bardzo brzydki) kod:
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;
Teraz spróbuj odgadnąć wartości ... kod czytanie nie jest jasne, co połączenia muszą iść ... przekazuję liczbę całkowitą, a następnie w wersji Integer oveload ... która nazywa się ... Real48 przeciążona lub Real jedna lub podwójna? ... to samo dotyczy przekazywania Real48, a także przekazywania Real ...
Kompilator nie znalazł żadnego błędu ... ale nie wiem, który (jeśli tylko jeden) zostanie wywołany ... bez śledzenia, oczywiście!!! czy możesz?
W takich sytuacjach, gdzie Explicit obsada byłoby idealne do pracy ...
Uwaga kładę 1.0+, 2.0+, 4.0+, 8.0+ ... potęgi 2 ... więc jakakolwiek suma niektórych lub niektórych z nich można zobaczyć ... jeśli resoult ma 15 ... wszystkie z nich zostały uruchomione ... jeśli 3 tylko 1.0 i 2.0, itd ... tryb binarny !!! jak bity wagi, itp ... to tylko pokazać, jak kod może stać się zbyt skomplikowany ... tylko dlatego, że przeciążona funkcja musi mieć różne parametry ...
To nie jest dozwolone, ponieważ kompilator nie wie, który jeden zadzwonić:
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;
Tak, kompilator jest dość głupie ... to może być zestawiane tylko w przypadkach, gdy MojaFunkcja jest używane na assigment .... se ten kod:
MyVarOfTypeReal48:=MyFunc(1); // It can know return value must be Real48, so call that one... but compiler is not so Intelligent
W takich przypadkach można wiedzieć, do kogo należy zadzwonić .... problem dotyczy:
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).
Mam nadzieję, że to pomoże!
Nie tylko przypisuje to zadanie? –
Tak przypisywanie powinno działać, ponieważ int jest niejawnie wymienialne na zmiennoprzecinkowe. – CodesInChaos
Czy "h" zostało wpisane jako float? –