Autor Tema: Error al restar 2 numeros - Porque?  (Leído 6092 veces)

0 Usuarios y 1 Visitante están viendo este tema.

zxs23

  • Megabyte
  • ***
  • Mensajes: 146
  • Reputación: +5/-2
    • Ver Perfil
Error al restar 2 numeros - Porque?
« en: Noviembre 08, 2012, 01:15:58 pm »
Tengo este inconveniente y nose porque, se trata de una resta, el resultado deberia ser 0.09 pero sale otra cosa. Por que no me sale el resultado esperado?
Código: (VB) [Seleccionar]
Private Sub Command1_Click()

MsgBox Val(Text1) - Val(Text2)

End Sub

Private Sub Form_Load()
Text1 = "14.29"
Text2 = "14.20"
End Sub

Este es el resultado: 8.99999999999999E-02

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #1 en: Noviembre 08, 2012, 01:31:45 pm »
No recuerdo por qué se produce ese error. Una vez, hace mucho tiempo, me pasó algo similar. Busqué en internet la explicación y la encontré, pero, como dije, no la recuerdo. Lo resolví poniendo coma en lugar de puno y convirtiendo los valores a Currency (CCur).
Código: [Seleccionar]
Private Sub Command1_Click()
 
MsgBox CCur(Text1) - CCur(Text2) 'Convierto ambos valores a Currency
 
End Sub
 
Private Sub Form_Load()
Text1 = "14,29" 'Reemplazo el punto por la coma
Text2 = "14,20" 'Reemplazo el punto por la coma
End Sub

No sé si tratabas de resolverlo o si ya lo habías hecho y lo que querías era solo saber por qué sucedía eso. En este último caso, lamentablemente no puedo decirte nada.
Saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error al restar 2 numeros - Porque?
« Respuesta #2 en: Noviembre 08, 2012, 01:37:22 pm »
Tu resultado ponlo asi

MsgBox Format(Val(Text1) - Val(Text2), "0.00")

Y listo

Para todos los escenarios siempre formateo asi (usando tu ejemplo):

MsgBox Format(Val(Text1) - Val(Text2), "#,###,##0.00")

Si son resultados finales los guardo en la BD habiéndolos pasado por el formateo, pero si no lo son, o sea si luego los leere y los utilizo en algun calculo los guardo como son.
« última modificación: Noviembre 08, 2012, 01:53:06 pm por YAcosta »
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error al restar 2 numeros - Porque?
« Respuesta #3 en: Noviembre 08, 2012, 01:49:37 pm »
No recuerdo por qué se produce ese error. Una vez, hace mucho tiempo, me pasó algo similar. Busqué en internet la explicación y la encontré, pero, como dije, no la recuerdo. Lo resolví poniendo coma en lugar de puno y convirtiendo los valores a Currency (CCur).
Código: [Seleccionar]
Private Sub Command1_Click()
 
MsgBox CCur(Text1) - CCur(Text2) 'Convierto ambos valores a Currency
 
End Sub
 
Private Sub Form_Load()
Text1 = "14,29" 'Reemplazo el punto por la coma
Text2 = "14,20" 'Reemplazo el punto por la coma
End Sub

No sé si tratabas de resolverlo o si ya lo habías hecho y lo que querías era solo saber por qué sucedía eso. En este último caso, lamentablemente no puedo decirte nada.
Saludos.

mmm, creo que no se debe considerar como un error, sucede que Val te entrega el resultado como si fuera un Double, y la resta de decimales 14.29 y 14.20 (que son aproximados) los trata como 14.29000000000000-14.2000000000000 y entra el rollo de la exactitud en dichos decimales (alguien con mas conocimientos matemáticos lo explicaría mejor), al final el valor correcto es 8.99999999999999E-02 (asi con el exponente) pero impráctico para nosotros que lo podríamos traducir como error y en realidad solo es un tema de presentación, por ello debemos formatear el resultado final a la cantidad de decimales que necesitemos.
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #4 en: Noviembre 08, 2012, 04:51:41 pm »
Excelente aclaración, Yván. No lo había pensado así.
Muchas gracias por explicarlo.

zxs23

  • Megabyte
  • ***
  • Mensajes: 146
  • Reputación: +5/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #5 en: Noviembre 08, 2012, 06:41:46 pm »
HOLA. Si, excelent explicacion, pues como haria para solucionar este caso y me guarde ZERO en la BD y no tremenda cadena de numeros.
Lo que menciona me parece bien pero si sucede esto dentro de una consulta como seria, dejo el ejemplo, supongo que habria que aplicarle el Format a la consulta puesto que uno de los 2 valores es tomado directamente de la BD en este caso saldo y el otro No como es el caso txtDinero.

Código: [Seleccionar]
.Execute "UPDATE detallecobros SET saldo=saldo-'" & Val(txtDinero) & "' WHERE idDeta='405'"
« última modificación: Noviembre 08, 2012, 06:46:05 pm por zxs23 »

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #6 en: Noviembre 08, 2012, 07:48:17 pm »
Nunca me pasó eso en una consulta de este tipo. ¿Te ha pasado en este caso en particular?

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error al restar 2 numeros - Porque?
« Respuesta #7 en: Noviembre 08, 2012, 11:41:12 pm »
HOLA. Si, excelent explicacion, pues como haria para solucionar este caso y me guarde ZERO en la BD y no tremenda cadena de numeros.
Lo que menciona me parece bien pero si sucede esto dentro de una consulta como seria, dejo el ejemplo, supongo que habria que aplicarle el Format a la consulta puesto que uno de los 2 valores es tomado directamente de la BD en este caso saldo y el otro No como es el caso txtDinero.

Código: [Seleccionar]
.Execute "UPDATE detallecobros SET saldo=saldo-'" & Val(txtDinero) & "' WHERE idDeta='405'"

Como te dije aplicas el format solo para la presentación o solo si se trata de saldos finales (los que ya no tendrán cálculos "relevantes"), pero si operas (ya sea dentro de una consulta SQL o no) almacénalo como tal y listo, no deberías tener mayor complicación. Para esto tu campo como mínimo debes tenerlo como Double, en tu lugar yo mandaría la consulta asi:
Código: [Seleccionar]
.Execute "UPDATE detallecobros SET saldo=saldo-" & Val(txtDinero) & " WHERE idDeta='405'"

Otro detalle, tu campo idDeta no deberías mandarlo con comilla simple, presumo que ese campo es Long (o Integer en todo caso) y por tanto tu consulta terminaría así:
Código: [Seleccionar]
.Execute "UPDATE detallecobros SET saldo=saldo-" & Val(txtDinero) & " WHERE idDeta=405"

Los valores los mandas sin comillas, las cadenas o string si los mandas con comillas simples, salvo los valores que no los trataras como tal por ejemplo el DNI, ese si lo mandas con comillas simples.

Si luego lees tu campo saldo y lo presentas en algún reporte o algún control entonces lo formateas.

Saludos
« última modificación: Noviembre 08, 2012, 11:47:27 pm por YAcosta »
Me encuentras en YAcosta.com

zxs23

  • Megabyte
  • ***
  • Mensajes: 146
  • Reputación: +5/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #8 en: Noviembre 10, 2012, 10:35:00 pm »
El idDeta es un autonumerico, gracias por las respuestas, saludos

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error al restar 2 numeros - Porque?
« Respuesta #9 en: Noviembre 11, 2012, 01:10:49 pm »
El idDeta es un autonumerico, gracias por las respuestas, saludos

Es correcto, entonces no es necesario que lo mandes con comillas simples ya que se trata de un campo Long (Numérico). Debes tener en cuenta que el tipo de dato Autonumerico no existe, es una falacia que Access lo ponga como "tipo de datos".


En realidad es un Long (o Entero largo como dice) e internamente debe manejar una especie de trigger y un generador a los cuales no podemos acceder y solo usar (hablando estrictamente de Access)

Saludos
Me encuentras en YAcosta.com

zxs23

  • Megabyte
  • ***
  • Mensajes: 146
  • Reputación: +5/-2
    • Ver Perfil
Re:Error al restar 2 numeros - Porque?
« Respuesta #10 en: Noviembre 12, 2012, 07:27:40 pm »
Estas en lo correcto vale la aclaracion,  :Dsaludos