Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Bug o es normal? - Trunc function (https://www.clubdelphi.com/foros/showthread.php?t=35533)

xEsk 13-09-2006 15:32:24

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

luisgutierrezb 13-09-2006 16:04:00

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?

kuan-yiu 13-09-2006 16:39:34

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

jachguate 13-09-2006 17:31:21

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.

;)

xEsk 14-09-2006 00:04:39

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.

jachguate 14-09-2006 00:57:39

Cita:

Empezado por xEsk
lo q yo queria es pasar de un "real" a un "entero" (Real -> Integer/Word)

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

;)

xEsk 14-09-2006 01:54:02

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 :p xDDD)

Saludos.


La franja horaria es GMT +2. Ahora son las 09:42:29.

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