Cambia valores decimales del double al sumar 1

Hola Mauricio.

Para solucionar esto, yo manejo el dato tipo String al enviar a la base de datos. De manera que cuando obtenga el valor, nunca me lo dará redondeado o estimado.

Pero antes de hacerlo, es importante que XOJO te de los valores correctos.

Dime que pasa en tu XOJO, si haces lo siguiente:

----
Var Primer_Valor As Double = 0.037
Var Segundo_Valor As Double = 1
Var Suma As Double

Suma = Primer_Valor + Segundo_Valor

MessageBox(Suma.ToText)
----
Var Primer_Valor As Double = 0.037
Var Segundo_Valor As Integer = 1
Var Suma As Double

Suma = Primer_Valor + Segundo_Valor

MessageBox(Suma.ToText)
----

Dependiendo de esto, puedes manejar muy bien los valores usando String. En mi versión de XOJO, no manipula los valores finales (tampoco lo hace la base de datos cuando guarda valores Double).

1 Like

Antes de que se me olvide. Si tu haces algo similar a esto:

SELECT MiCampoDouble+1 As Suma FROM MiTabla

Esto se arregla de forma distinta.

Ambos me devuelven lo mismo

Primer Resultado = 1.037000
Segundo Resultado = 1.037000

Mediante la SQL podría ser, el tema es que luego algún manejo de Double puedo tener y no deseo que me devuelva un valor en los decimales que no tengo establecido.

Ok
En este caso, cuéntame. Donde haces los cálculos ?
Es posible ver algo de código, donde ocurre el redondeo que mencionas?

Como adjunto al comienzo, la imagen muestra en la columna VALOR lo que está grabado en la base de datos.
Leo ese campo VALOR y lo paso a una variable dblINTERES que es double, si NO le sumara 1, el valor es el mismo, no lo cambia, PERO al sumarle 1 me lo cambia.

dblINTERES = 1 + larsRecordset.Column(“VALOR”).DoubleValue

Si formateara ese numero a un string (strINTERES) me queda correcto PERO al pasarlo nuevamente a DOUBLE para futuras operaciones me vuelve a quedar mal.
strINTERES = Format(dblINTERES, “#0.0000”) aqui lograba lo que queria en string pero al pasarlo a double hacia lo mismo

Mauricio,

Double siempre será inexacto. Si quieres exactitud hasta 4 decimales debes usar Currency. Si necesitas más decimales puedes usar un plugin de Bob Delaney http://delaneyrm.com/ o algún plugin de pago como los de MBS https://www.monkeybreadsoftware.de/

El que veas que los valores que mencionas son ‘correctos’, por ejemplo el 0.037, es realmente una ilusión por la forma en que Xojo muestra la información. En realidad 0.037 no es 0.037 simplemente se muestra así por la cantidad de 9s después del 0.036

Código de ejemplo:

Var d As Double = 0.037
Var s As String = Format(d, "#.##########################")
Break

Lo que se muestra en el debuger:
image

Espero que con esto quede más claro el tema y puedas tomar una decisión sobre si sigues usando double o buscas una alternativa.

Saludos

2 Likes

Estimados , gracias a todos por sus comentarios.
:+1:

Ya comprendo.

Intenta algo similar a esto:


Var StringNumber As String = "0.65042"
Var DoubleNumber As Double = 1
Var Total As Double

Total = DoubleNumber + StringNumber.ToDouble
MessageBox(Total.ToString)

En tu caso, hay que hacer algo semejante a esto:


Var StringNumber As String = larsRecordset.Column(“VALOR”).Value
Var DoubleNumber As Double = 1
Var dblINTERES As Double

dblINTERES = DoubleNumber + StringNumber.ToDouble

MessageBox(Total.ToString)

Me dices como te funciona.

El comportamiento de los decimales que describes es propio del tipo Double de MySQL no de Xojo. Puedes intentar usar en Xojo Double para los calculos que requieras y definir el campo en MySQL como Decimal para almacenarlo y te permite usar mas de 4 decimales.

Hola @Carlos_Antonio_Cratere_Hernánd el comportamiento NO se debe al MySQL como indicas ya que lo tengo con los decimales y si miras la captura con la que comienzo veras los valores en MySQL.
El problema que se me presenta SI lo provoca el manejo de Double de Xojo, en VB6 no tengo problema con exactamente lo mismo.
Igual entiendo que el comportamiento de Double en Xojo es distinto (y según entiendo el correcto), me parecería práctico si se pudiera “delimitar” fácilmente los decimales a recibir.

Ya vi varios casos en el foro y sigo pensando que no es simple, nada más.
Muchas gracias a todos, doy por terminado éste tema.