Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Operaciones en delphi (https://www.clubdelphi.com/foros/showthread.php?t=30759)

salvica 17-04-2006 23:30:57

Operaciones en delphi
 
¿Alguien puede indicarme la diferencia entre éstas dos operaciones? (solo se trata de pasar un real a entero y ponerlo en el caption de un TPanel)
Código Delphi [-]
const
unValor = -3.4; // es un valor de prueba
var
fValor : real;
begin
   fValor := Abs( unValor );
   Panel1.Caption := IntToStr( Trunc(fValor*10) ); //--- esto me pone 3.5

   fValor := Abs( unValor*10 );
   Panel1.Caption := IntToStr( Trunc(fValor) ); //------ esto me pone 3.4
end;
¿A qué viene esa diferencia?
Gracias, parece una tonteria pero me lleva una semana sin dormir
salvica

alapaco 17-04-2006 23:38:56

A mi ambos ejemplos me dan 34 como resultado..

[Gunman] 17-04-2006 23:43:47

Yo he probado tu código: el primero me devuelve 33 y el segundo 34.

[Gunman] 17-04-2006 23:51:23

Mmmm, que versión de windows tenéis?
PD: alapaco, habrás puesto cada parte del código en dos botones separados, no? Yo no me había dado cuenta al principio y tenia el código en un mismo botón, el código ha de ser así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
unValor = -3.4;
var
fValor : real;
begin
fValor := Abs( unValor );
Panel1.Caption := IntToStr( Trunc(fValor*10) );
end;

procedure TForm1.Button2Click(Sender: TObject);
const
unValor = -3.4;
var
fValor : real;
begin
fValor := Abs( unValor*10 );
Panel1.Caption := IntToStr( Trunc(fValor) );
end;

[Gunman] 18-04-2006 00:05:50

El problema está aquí:
Trunc(fValor*10);
he probado de en vez de ponerle *10 ponerle *15 y el resultado debería ser 51, sin embargo devuelve 50.
Pero si tu pones fvalor = fvalor*15 y después hace el Trunc(fValor) funciona correctamente.
No se si te he dicho algo que no sabías, pero no se el porqué de la cuestión.
Sin duda, una duda muy interesante.

salvica 19-04-2006 08:34:35

Cita:

Empezado por [Gunman]
El problema está aquí:
Trunc(fValor*10);

Era la conclusión a la habia llegado, pero no tengo ni idea del porqué.
Cita:

Empezado por [Gunman]
El problema está aquí:
No se si te he dicho algo que no sabías, pero no se el porqué de la cuestión.
Sin duda, una duda muy interesante.

Tan interesante, que llevo un montón de días "comiéndome el tarro":rolleyes: :rolleyes: :rolleyes:
Gracias a todos
Salvica.

Por cierto: w2000 y D-7
Repito: gracias

Lepe 19-04-2006 13:20:42

Cita:

Empezado por Ayuda de Trunc
The Trunc function truncates a real-type value to an integer-type value. X is a real-type expression. Trunc returns an Int64 value that is the value of X rounded toward zero.

(1) - No es lo mismo hacer: Trunc(3.4) *10
(2) -que Trunc(3.4*10)

Al hacer el (1), primero redondeamos (perdiendo decimales) y despues multiplicamos.

Al hacer (2) multiplicamos por 10 (estamos cogiendo un decimal) y despues redondeamos (pero ya no tenemos decimales que perder!!)

Saludos

salvica 20-04-2006 11:58:11

Cita:

Empezado por Lepe
Al hacer (2) multiplicamos por 10 (estamos cogiendo un decimal) y despues redondeamos (pero ya no tenemos decimales que perder!!)
Saludos

Según parece, Delphi, primero trunca y luego multiplica, aunque la función debiera truncar el contenido, o sea, el resultado de multiplicación.

En fin, las cosas son según el cristal con que se miran y el cristal de Delphi parece estar "esmerilado" :D:D:D

Saludos
salvica


La franja horaria es GMT +2. Ahora son las 12:06:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi