zamiana typów (real, integer)

0

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?

0

funkcja Trunc() obcina część ułamkową, natomiast Round() zaokrągla zmiennoprzecinkową na całkowitoliczbową.

BTW. Real nie powinno się używać, wiesz o tym?

0

BTW: Czemu real sie nie powino używać? :>

0

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).

0

to w jaki inny sposób podzielić 10 zł na 3600 sekund?

0

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;
0
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

0

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...

0

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

0

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 :

  1. jeśli Ci zależy do 1/1000 to reszta:=(10*1000) div 3600
  2. 1/1000000 to reszta:=(10*1000000) div 3600

Najważniejsze to pomysł !!!

0

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.

0

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!

0

A jak zamienić liczbę rzeczywistą = 0.0002345 na string i jak taki string zamienić na liczbę rzeczywistą?

0
FloatToStr, StrToFloat 
0

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ć :(

0
FormatFloat('0.00',1.234567)

1 użytkowników online, w tym zalogowanych: 0, gości: 1