Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Integer y extended (https://www.clubdelphi.com/foros/showthread.php?t=58931)

radge 06-08-2008 17:18:05

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

coso 06-08-2008 18:11:52

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.

Delphius 06-08-2008 18:19:22

Cita:

Empezado por coso (Mensaje 306106)
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,

coso 06-08-2008 18:27:54

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.

radge 07-08-2008 10:16:36

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

coso 07-08-2008 10:39:46

bueno, un entero no puede tener decimales...

coso 07-08-2008 10:41:08

Se pueden comparar tambien decimales en las consultas de sql, quiza deberias tirar por alli, en vez de intentar poner en ella un entero.

radge 07-08-2008 10:49:41

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.

coso 07-08-2008 11:08:07

bueno, este numero 252.5 es un decimal, el cual su parte entera es 252. Contra que lo quieres comparar?

coso 07-08-2008 11:09:14

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)

radge 07-08-2008 11:15:18

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 ".".

coso 07-08-2008 11:33:45

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]);

JeanSolo 07-08-2008 22:16:33

Hola ! la variable que recibira el resultado debe ser de tipo real o variant

radge 08-08-2008 08:21:12

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

coso 08-08-2008 09:19:53

strtoint te deberia servir, si es entero, sino strtofloat

Delphius 08-08-2008 16:51:18

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,

JCX 12-08-2008 02:40:40

Recibir como string un número pienso que resulta arriesgado :eek: ... 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.


La franja horaria es GMT +2. Ahora son las 14:15:30.

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