Witam
Czy jest jakiśbezbolesny sposób żeby zamienić liczbę integer na real i real na integer?
Jak wygląda zaokrąglanie w takich przypadkach?
funkcja Trunc() obcina część ułamkową, natomiast Round() zaokrągla zmiennoprzecinkową na całkowitoliczbową.
BTW. Real nie powinno się używać, wiesz o tym?
BTW: Czemu real sie nie powino używać? :>
Bo real (48-bitowy) nie jest typem sprzętowym koprocesora. Jego obsługą zajmuje się program i procesor. Ma w związku z tym inna budowę (zamienionaa cecha z mantysą) i jest sporo wolniejsze (cos mi się wydaje, że to jest w helpie).
to w jaki inny sposób podzielić 10 zł na 3600 sekund?
To proste dzielisz 2 razy przez div czyli wynik liczby całkowitej oraz mod reszta z dzielenia w postaci liczby całkowitej czli:
Var
caly,reszta:longint;
begin
caly:=10 div 3600;
reszta:=10 mod 3600;
end;
reszta:=10 mod 3600;
showmessage(IntToStr(reszta));
i wynik dostaję '10', a wg kalkulatora Windows wynik to 0.00277777....
czyli powinienem otrzymać '002777...'
czegoś tu nie rozmumiem
czegoś tu nie rozmumiem
Widocznie nie wiesz co to jest reszta z dzielenia. Podziel to co uzyskales za pomoca mod przez dzielnik czyli 10 / 3600 i bedziesz mial 0,002777...
czyli 10 / 3600 i bedziesz mial 0,002777...
I mamy liczbę zmiennoprzecinkową.
Ale mi chodziło o to żeby wynik moża było zapisać jako integer.
Czyli "calosc.reszta"
Jeśli reszta z dzielenia 10 / 3600 = 10, to wychodzą mi jakieś bzdury.
Chyba najłatwiej będzie to zrobić na liczbach real.
To nie jest jakiś skomplikowany program. Tylko się bawię i poznaję ten język więc mam z tym pewne kłopoty
Niestety ale zła wiadomość dla Ciebie.
Funkcja mod podaje resztę z dzielenia ale w jej 10 części.
trudno byłoby zpisać w INTEGER liczbę = 0022777 bo atomatycznie będzie to 22777
Możesz to zrobić tak :
- jeśli Ci zależy do 1/1000 to reszta:=(10*1000) div 3600
- 1/1000000 to reszta:=(10*1000000) div 3600
Najważniejsze to pomysł !!!
nie, czekajcie! nie chodziło mi o to aby zrezygnować z liczb zmiennoprzecinkowych, ale o to, ze klasyczny Real jest typem 6-bajtowym, który nie ma odwzorowania w typach procesora jak to flabra napisał. Mozna używać innych typów zmiennoprsecinkowych np. double.
Początwszy od Delphi 4 zdaje się type Real jest to to samo co typ Double, a klasyczny, Turbo pascalowy Real nazywa się Real48. Ale już w Delphi 8 i zapewne w przyszłym Diamondbacku określenia typu Real, jak i Real48 NIE MA. Tutaj chciałem jedynie podkreślić kwestię przyszłej kompatybilności.
Ja tylko chciałem wyprostować.. niektórzy źle rozumieją tu znaczenie słowa "mod" - reszta z dzielenia..
Weźmy przykład:
5 : 2 = 2.5
<font color="olive">5 div 2</span> - oznacza część całkowitą z dzielenia 5 przez 2, która jest równa 2
<font color="olive">5 mod 2</span> - oznacza resztę z dzielenia 5 przez 2, która nie jest równa 5 jak w zapisie 2.5.
Dzielę 5 przez 2. Dwójka mieści się 2 razy w liczbie 5 - to daje 4 - zostaje 1, i to jest właśnie 5 mod 2.
Inny przykład: 10 : 4
10 div 4 = 2
// Bo 2 razy się mieści
10 mod 4 = 2
// Bo tyle zostaje
A nie "10 mod 4 = 5" - to jest błąd!
A jak zamienić liczbę rzeczywistą = 0.0002345 na string i jak taki string zamienić na liczbę rzeczywistą?
FloatToStr, StrToFloat
Ok, wielkie dzięki. Program już liczy :)
Jeszcze jedno pytanko, jak to zaokrąglić do 2 miejsca po przecinku?
z 1.234567 zrobić 1.23
W TP trzeba było napisać :2
w OP nie chce mi tego kompilować :(
FormatFloat('0.00',1.234567)