Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Bug o es normal? - Trunc function

Me he encontrado q la funcion Trunc no hace bien su proposito, o eso me parece (vamos, yo diria q no es normal ). Uso Delphi 2k6.

Ahi va el ejemplo q creo q demuestra q no funciona (o eso creo yo):

Código Delphi [-]
var
  Valor1: Real;
  Valor2: Word;
begin
  Valor1:=(2006.09 - Int(2006.09)) * 100;  // resultado = 9
  Valor2:=Trunc(Valor1); // resultado = 8
  ShowMessage(IntToStr(Valor2));

He probado cambiando el 100 por 101 o 100.01 (entre otros), y si funciona, pero no veo logico lo q hace con 100 exactos:
Código Delphi [-]
var
  Valor1: Real;
  Valor2: Word;
begin
  Valor1:=(2006.09 - Int(2006.09)) * 100.01;  // resultado = 9,0009
  Valor2:=Trunc(Valor1); // resultado = 9
  ShowMessage(IntToStr(Valor2));

Quizas sea ya un "bug" conocido, pero... si no es un bug, ¿puede alguien explicarmelo el pq hace esto?, hehe Gracias.
Responder Con Cita
  #2  
Antiguo 13-09-2006
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
yo creo que el problema puede estar en la operacion con numeros reales, no tanto en el trunc, porque no intentas usar el tipo currency en lugar del real?
Responder Con Cita
  #3  
Antiguo 13-09-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Y pregunto yo, ¿todo esto es para obtener la parte decimal de un número? Porque si es así acabas antes usando la función Frac()
Responder Con Cita
  #4  
Antiguo 13-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Con la poca precisión del real, lo mas seguro es que valor1 no sea nueve, sino en realidad 8.999999999996 o algo así. Evidentemente, el trunc de eso es 8 y no 9. Pero este no es un problema de delphi, es un problema de las computadoras y los formatos para almacenar números.

Como ya te dijeron, podes obtener la parte fraccionaria directamente, o usar números con mas precisión, como los Double. Aún con estos, el problema persistirá, solo que ocurrirá menos veces (aquellas para las que la precisión del número resulte insuficiente para la operación que realizas y el resultado que queres ver).

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
No, no lo hago para obtener la parte decimal, eso es un pequeño ejemplo q he puesto, lo q yo queria es pasar de un "real" a un "entero" (Real -> Integer/Word), y me di cuenta q en el codigo original no me devolvia el valor "correcto" e hice este pequeño (e inutil) ejemplo para comprobarlo.

Pero probare con double u otros.

Saludos.

Última edición por xEsk fecha: 14-09-2006 a las 00:08:13.
Responder Con Cita
  #6  
Antiguo 14-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por xEsk
lo q yo queria es pasar de un "real" a un "entero" (Real -> Integer/Word)
Pues depende de lo que signifique pasar de un real a un entero. Yo diría que una forma "segura" de hacerlo es:

Código Delphi [-]
  Entero := Trunc(RoundTo(DoblePrecision, 0));

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
jachguate lo de pasar de una variable con un valor "Real" a un "Integer" era pq necesitaba acceder a una posicion de un "Array", y la posicion se obtenia apartir de una formulita (xorra) q requeria de numeros reales, pero el resultado era un numero "natural". Tu solucion es buena tambien, pero con cambiar de "Real" a "Extended" ya funciono bien (y asi me libro de incluir Math al uses xDDD)

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
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
Return value of function might be undefined momo OOP 5 27-06-2006 23:20:44
Tablas en Function rolando_s Conexión con bases de datos 2 23-12-2004 21:26:59
Create Function rickymarti Firebird e Interbase 1 02-12-2004 10:37:00
Function vtdeleon OOP 1 25-11-2004 07:22:48
SQL Server - Función TRUNC Viet SQL 7 21-11-2003 21:24:52


La franja horaria es GMT +2. Ahora son las 00:49:31.


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
Copyright 1996-2007 Club Delphi