Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 17-04-2006
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 297
salvica Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 17-04-2006
alapaco alapaco is offline
Miembro
 
Registrado: jun 2003
Ubicación: Buenos Aires
Posts: 287
alapaco Va por buen camino
A mi ambos ejemplos me dan 34 como resultado..
Responder Con Cita
  #3  
Antiguo 17-04-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
[Gunman] Va por buen camino
Yo he probado tu código: el primero me devuelve 33 y el segundo 34.
__________________
l2prog.co.nr
Responder Con Cita
  #4  
Antiguo 17-04-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
[Gunman] Va por buen camino
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;
__________________
l2prog.co.nr
Responder Con Cita
  #5  
Antiguo 18-04-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
[Gunman] Va por buen camino
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.
__________________
l2prog.co.nr
Responder Con Cita
  #6  
Antiguo 19-04-2006
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 297
salvica Va por buen camino
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"
Gracias a todos
Salvica.

Por cierto: w2000 y D-7
Repito: gracias
Responder Con Cita
  #7  
Antiguo 19-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.331
Lepe cantidad desconocida en este momento
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 20-04-2006
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 297
salvica Va por buen camino
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"

Saludos
salvica
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Operaciones de conjuntos. C# sakuragi .NET 2 18-06-2006 23:05:41
Operaciones con Binarios douguiehm Varios 0 19-05-2005 19:41:08
Operaciones con fechas febito Oracle 1 05-08-2004 04:30:09
operaciones con tiempo supperguss Varios 1 21-05-2003 02:39:53
operaciones con fechas ing_alsaac Varios 2 11-05-2003 11:02:57


La franja horaria es GMT +2. Ahora son las 06:16:58.


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