Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 16
radge Va por buen camino
Integer y extended

Buenas tengo una tquery donde despues de hacer la sql recojo los datos para operar con ellos de esta forma

Código Delphi [-]
var
   Total_Linea,: Extended;
begin
...
...
       Total_Linea := qry.FieldByName ('cantidad').AsInteger *
                      qry.FieldByName ('price').AsInteger-
                      (qry.FieldByName ('cantidad').AsInteger *
                       qry.FieldByName ('price').AsInteger *
                       (qry.FieldByName ('ALB_Dto').asinteger / 100));


Lo que hago es recoger varios valores que me ha devuelto la sql y multiplicarlos y dividirlos tal cual , he probado con extended porque con integer la última linea que divido /100 no me la pilla.

La cuestión es que con extended me hace el calculo , pero claro despues quiero pasarlo a integer y no veo la forma.

gracias , radge
Responder Con Cita
  #2  
Antiguo 06-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola, para dividir enteros, se usa div (3 div 2). para redondear a enteros desde un float, puedes usar round, int, integer, trunc o floor.
Responder Con Cita
  #3  
Antiguo 06-08-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por coso Ver Mensaje
hola, para dividir enteros, se usa div (3 div 2). para redondear a enteros desde un float, puedes usar round, int, integer, trunc o floor.
Sólo una pequeña observación... no es lo mismo truncar que redondear. Recomiendo que se piense bien que se desea obtener y en base a ello o se redondea o se trunca.

¿Es necesario la parte entera?¿O por el contrario, es más adecuado redondear?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 06-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
cierto. El floor, de la misma manera, redondea para abajo. El int lo puse pero revisando la ayuda veo que devuelve un extended tambien asi que no creo que te sirva, y el integer es un typecast.
Responder Con Cita
  #5  
Antiguo 07-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 16
radge Va por buen camino
Disculpar mi inexperiencia en el mundo de delphi.

Yo lo que quiero obtener es un float ( es decir necesito los decimales) sin redondear.

Tal cual me hace la operación correctamente

Código Delphi [-]
var
   Total_Linea, Dto_Linea, ALB_Dto: Extended;
begin
         if ALB_Dto = null then
            ALB_Dto := 0;
         try
            Total_Linea := qry_LinAlbaran.FieldByName ('cantidad').AsInteger *
                           qry_LinAlbaran.FieldByName ('price').AsCurrency-
                           (qry_LinAlbaran.FieldByName ('cantidad').AsInteger *
                            qry_LinAlbaran.FieldByName ('price').AsCurrency *
                           (ALB_Dto /100));

Pero claro despues no se como recoger ese valor del extended... yo necesitaria devolver un integer para insertar lo a la sql.


Despues otra cosa , esto lo tengo en un bucle con lo cual me gustaria ir sumando todos los valores de total_linea , pero si es extended no se como.

SumaTotal := SumaTotal + TotalLinea; (<== esta ultima del tipo extended)


gracias , radge

Última edición por radge fecha: 07-08-2008 a las 10:37:43.
Responder Con Cita
  #6  
Antiguo 07-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
bueno, un entero no puede tener decimales...
Responder Con Cita
  #7  
Antiguo 07-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Se pueden comparar tambien decimales en las consultas de sql, quiza deberias tirar por alli, en vez de intentar poner en ella un entero.
Responder Con Cita
  #8  
Antiguo 07-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 16
radge Va por buen camino
A ver pongamos un ejemplo

precio : 50,50
cantidad : 10
descuento : 50%


Yo hago lo siguiente : 50,50 * 10 - ( 50,50 * 10 * (50 / 100)
Total = 252.5


Yo esto tal como lo hago lo guardo en un "extended" el problema es despues que no veo como transformar ese numero para ponerlo en el sql , yo luego quiero insertarlo en la sql.
Responder Con Cita
  #9  
Antiguo 07-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
bueno, este numero 252.5 es un decimal, el cual su parte entera es 252. Contra que lo quieres comparar?
Responder Con Cita
  #10  
Antiguo 07-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cita:
SumaTotal := SumaTotal + TotalLinea; (<== esta ultima del tipo extended)
si lo que quieres es que te cuente los decimales en esta suma, lo mejor sera que sumatotal sea extended y una vez hecha toda la suma, entonces pasarla a entero (aunque claro esta, se perderan los decimales)
Responder Con Cita
  #11  
Antiguo 07-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 16
radge Va por buen camino
A ver tal como dices si tengo varios registros como estos

100,10
100,10
100,10

El total es 300,30 , yo necesito eso 300,30 con todos sus decimales

Otra opción que he encontrado es usar floattostr

FloatToStr(SumaTotalLinea) , lo cual me devuelve 300,30.

Ahora solo me falta substituir la "," por el ".".
Responder Con Cita
  #12  
Antiguo 07-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Si necesitas los decimales, entonces no debes usar el integer para nada.

Puedes usar

Código Delphi [-]
numero_en_string := FormatFloat('0.00',numero_float);
numero_en_string := StringReplace(numero_en_string,',','.',[rfReplaceAll,rfIgnoreCase);

o bien
Código Delphi [-]
numero_en_string := Format('%2.2f',[numero_float]);
Responder Con Cita
  #13  
Antiguo 07-08-2008
JeanSolo JeanSolo is offline
Registrado
 
Registrado: abr 2006
Posts: 1
Poder: 0
JeanSolo Va por buen camino
Smile

Hola ! la variable que recibira el resultado debe ser de tipo real o variant
Responder Con Cita
  #14  
Antiguo 08-08-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 16
radge Va por buen camino
Ahora tengo otra duda ,


Alb_Importe : string;
ImportResta , SumaTotalLinea, : extended;


Recibo de otro formulario un "String" llamado "ALB_importe"


Código Delphi [-]
ImportFloat := FormatFloat('0.00',SumaTotalLinea); 
ImportFloat := StringReplace(ImportFloat, ',' , '.',[rfReplaceAll,rfIgnoreCase]);
ImportResta := ALB_Importe - SumaTotalLinea;

Es decir yo recibo un string , intento pasarlo a integer y entonces darle formato para poder hacer la resta

gracias , radge

Última edición por radge fecha: 08-08-2008 a las 08:24:19.
Responder Con Cita
  #15  
Antiguo 08-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
strtoint te deberia servir, si es entero, sino strtofloat
Responder Con Cita
  #16  
Antiguo 08-08-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
He visto que estás empleando el tipo extended en vez de real.¿Es necesario que emplees dicho tipo? Puede que con el real te baste y sobre.

Si se trata de datos monetarios, por lo general es preferible tratar con el tipo Currency, que supuestamente ha sido diseñado para tener una buena precisión es los cálculos monetarios.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 12-08-2008
JCX JCX is offline
Registrado
 
Registrado: feb 2008
Ubicación: Guatemala
Posts: 4
Poder: 0
JCX Va por buen camino
Recibir como string un número pienso que resulta arriesgado ... de preferencia usar edición con mascara como TMaskEdit.

En lugar de usar StrToInt o StrToFloat para convertir ALB_importe, mejor usar StrToIntDef o StrToFloatDef, Ej.:

StrToFloatDef(ALB_importe,0);

Esto garantiza que si ALB_importe no es un numero siempre se regresa 0.00 como importe ...

Las funciones que no tienen Def generan la excepcion EConvertError.
Responder Con Cita
Respuesta



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
Diferencias entre real y extended Delphius Varios 6 05-08-2008 02:10:37
Key o Integer? MaMu Varios 3 31-01-2008 22:47:57
Float o Integer Caral Varios 9 24-11-2006 10:23:31
incompatible integer and extended emiliu Varios 3 09-12-2005 19:45:16
de String a Integer!! kye_z Varios 2 20-11-2004 20:04:36


La franja horaria es GMT +2. Ahora son las 18:08:10.


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