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 06-08-2014
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
valores float en resta no devuelven cero

buenas tardes
tal como lo dice el titulo
resto 2 numeros

2710 - 2710 y el resultado en lugar de ser 0 es -2.2737367544e-13

q sucede?
se q he visto la solucion por aqui pero no la encuentro
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #2  
Antiguo 06-08-2014
blackx5n blackx5n is offline
Miembro
 
Registrado: feb 2008
Posts: 51
Poder: 17
blackx5n Va por buen camino
Cool

Quizas estes haciendo algo mal, te tiene que dar cero si restas dos valores iguales.

checa este codigo

Código Delphi [-]
var
   a,b,r:Real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
r:=a-b;
Label3.Caption:='Resultado: '+FloatToStr(r);
end;

Salu2
Responder Con Cita
  #3  
Antiguo 06-08-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Oscar.

Los números de punto flotante, en cualquier lenguaje de programación, son aproximaciones del valor que representan, por lo tanto las operaciones que hagas con ellos te darán como resultado aproximaciones también.

Para que nosotros podamos entender si hay o no hay un problema en tu aplicación, necesitarías decirnos de qué tipo son esos valores que restas y, sobre todo, qué se pretende hacer con el resultado.

Lo dicho ya muchas veces: en un foro, cuando en la pregunta se explica con detalle lo que acontece y qué se quiere lograr (contexto), las respuestas suelen llegar más rápido y ser más efectivas. ;-)
Responder Con Cita
  #4  
Antiguo 06-08-2014
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
tienes razon
estoy haciendo esto

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var sqlstr :string;
  _anio, _mes, _libro, _voucher, _CuentaGasto, _t_Analis, _Documento, _Anexo :String;
  _Suma, _pagos ouble;
  excel:Variant;
  fila,columna:Integer;
  Data : TDataSet;
begin
qryData104.Open;
ProgressBar1.Min := 0;
ProgressBar1.Max := qryData104.RecordCount;
while not qryData104.eof do
  begin
    Application.ProcessMessages;
    _pagos := qryData104Importe.AsFloat;
    ProgressBar1.Position := ProgressBar1.Position + 1;
    _t_Analis := '';
    _Anexo := '';

    sqlstr := 'Select * from DetalleCuenta104 where ' +
              'uanio = ' + QuotedStr(qryData104uanio.AsString)  +
              ' and umes = ' + QuotedStr(qryData104umes.AsString)  +
              ' and ulibro = ' + QuotedStr(qryData104ulibro.AsString)  +
              ' and uvoucher = ' + QuotedStr(qryData104uvoucher.AsString)  +
              ' and left(Cuentagasto,2) = ' + QuotedStr( Izquierda (qryData104CuentaGasto.AsString,2)) +
              ' and haber <> 0' +
              ' Order by anio, mes, libro, voucher';
    qryTemporal.SQL.Clear;
    qryTemporal.SQL.Add(sqlstr);
    qryTemporal.Open;
    qryTemporal.First;
    _Anio := qryTemporalanio.AsString;
    _mes := qryTemporalmes.AsString;
    _libro := qryTemporalLibro.AsString;
    _voucher := qryTemporalVoucher.AsString;
    _suma := 0;
    while not qryTemporal.eof do
    begin
      if (_anio = qryTemporalanio.AsString) and
         (_mes = qryTemporalmes.AsString) and
         (_libro = qryTemporalLibro.AsString) and
         (_voucher = qryTemporalVoucher.AsString) then
      begin
        if qryTemporalHaber.AsFloat <> 0 then
        begin
          if Izquierda(qryTemporalCuentaGasto.AsString,2) =  Izquierda(qryData104CuentaGasto.AsString,2) then
          Begin
            _Suma := _Suma + qryTemporalHaber.AsFloat;
            _CuentaGasto := qryTemporalCuentaGasto.AsString;
            _Documento := qryTemporalDocumento.AsString;
          End;
        end;
      end;
      qryTemporal.Next;
    end;
    if (_pagos - _Suma <> 0)  then  // Pagos Solos o incompletos
    Begin
      cdsDiferentes.Append;
      cdsDiferentesCuenta10.Value := qryData104cuenta10.AsString;
      cdsDiferentesuanio.Value :=  qryData104uanio.AsString;
      cdsDiferentesumes.Value := qryData104umes.AsString;
      cdsDiferentesulibro.Value := qryData104ulibro.AsString;
      cdsDiferentesuvoucher.Value := qryData104uvoucher.AsString;
      cdsDiferentesPago.Value := qryData104Importe.AsFloat;
      cdsDiferentesGasto.Value := _Suma;
      cdsDiferentest_analis.Value := _t_Analis;
      cdsDiferentesCuentaGasto.Value := _CuentaGasto;
      cdsDiferentesDocumento.Value := _Documento;
      cdsDiferentesAnexo.Value := _Anexo;
      cdsDiferentes.Post;
    End;
    qryData104.Next;
  end;

lo que esta resaltado
la idea es buscar en una tabla unos vouchers contables y verificar si la suma del haber cuadra con lo que esta en el queryData104
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 06-08-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Muchas gracias, Oscar.

Ahora sí puedo darte una de muchas soluciones posibles: Para valores monetarios, es mejor usar variables de tipo Currency (que son de punto fijo) que variables de tipo Double. Además, conviene usar la propiedad AsCurrency en lugar de AsFloat. Con todo esto las operaciones serán precisas.

Nos lo confirmas, por favor.

Al.
Responder Con Cita
  #6  
Antiguo 06-08-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Si no me equivoco lo que sucede es todas las bases de datos cuando almacena sun valor en un tipo de dato númerico lo guardan en binario, y el caso es que el paso de flotantes en decimal a binario y viceversa no es igual por lo que en algunos casos un número flotante decimal exacto al pasarlo a binario se convierte en periodico puro y por lo tanto el valor con que se guarda en la bd no es el mismo que hemos querido almacenar. Al recuperar el valor nos encontramos con problemas de ese estilo. En mi caso lo que suelo hacer cuando me encuentro con estes problemas es aplicar una función al valor recien recuperado de la bd ajustandolo al número de decimales que necesito realmente, con esto he solucionado mi problema siempre, eso si, hasta ahora no necesitando trabajar con mas de 12 decimales de precision. Otra solución que he utilzado a veces es reducir la unidad de medida con la que trabajo hasta el punto en el que no necesite utilizar decimales.
Trabajando con monedas hay varias soluciones posibles, pero si trabajas con medidas que necesitan realmente ser almacenadas en un tipo de dato que permita un nivel de precisión de muchos decimales me parece lo mejor utiilzar las soluciones que aplico. Si estoy equivocado o alguien utiliza una solución mejor me encantaria conocerlo ya que a este problema me enfrento habitualmente y siempre suelo hacer lo que he explicado.
Responder Con Cita
  #7  
Antiguo 06-08-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La solución es simple, lo ha comentado Al González, no usar float ni double, hay que usar currency, para eso sirve.
Responder Con Cita
  #8  
Antiguo 06-08-2014
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
La solución es simple, lo ha comentado Al González, no usar float ni double, hay que usar currency, para eso sirve.
+1

gracias muchachos... lo habia olvidado
__________________
Dulce Regalo que Satanas manda para mi.....
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
No imprimir valores en cero rruffino Impresión 6 05-07-2012 19:56:59
Valores en cero al exportar a Excel andresenlared Impresión 2 24-09-2007 22:32:28
precision en valores float el_barto Conexión con bases de datos 2 09-09-2005 07:22:52
SpinEdit con valores Reales (Float) neon OOP 1 23-02-2005 13:34:58
resta de dos numeros reales no da cero ... chelejuan Varios 4 21-01-2005 10:37:01


La franja horaria es GMT +2. Ahora son las 01:10:06.


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