Comparar 2 números exactamente iguales y fox dice que son distintos WTF

525 views
Skip to first unread message

Alex Field

unread,
Mar 23, 2016, 5:33:42 PM3/23/16
to Mundo Visual FoxPro
Estoy comparando una variable en memoria y un campo de una tabla, 
donde los dos datos son numéricos y el valor es 150.80
pero Fox me dice que son distintos.
resto uno con el otro y da cero, con lo cual son iguales, pero fox dice que son distintos.
pregunto si son iguales dice no,
si son distintos dice si,

muestro la imagen del Debug para ver el contenido.

alguna vez les paso ?
error comparación números.jpg

HernanCano

unread,
Mar 23, 2016, 5:57:44 PM3/23/16
to Mundo Visual FoxPro
>>> ... pero Fox dice que son distintos...

¿Dónde dice que son distintos?

HernanCano

unread,
Mar 23, 2016, 6:02:47 PM3/23/16
to Mundo Visual FoxPro
Quizá puedas intentar mostrar más decimales. Quizá al mostrarlo lo muestra "redondeado".

Otra es redondear las cifras antes de compararlas.

Fidel Charny

unread,
Mar 23, 2016, 7:55:59 PM3/23/16
to Mundo Visual FoxPro
Intenta con
IF ROUND(lnNumeroUno,2) = ROUND(lnNumeroDos,2)
      * Tal Cosa
ELSE
     * Tal Otra
ENDIF
He encontrado este problema en varias ocasiones, pero fundamentalmente cuando uno o ambos números son el resultado de SUM ALL campo1,campo2 TO lnNumeroUno,lnNUmero2

Por ejemplo, para comprobar el balance de un asiento contable utilizo:
SUM ALL DEBE,HABER TO lnDebe,lnHaber
IF ROUND(lnDebe,2) = ROUND(lnHaber,2)
    ** Función de guardado directo
ELSE
   ** Mostrar formulario de asiento para admitir correcciones.
ENDIF


Alex Field

unread,
Mar 24, 2016, 9:34:20 AM3/24/16
to Mundo Visual FoxPro
En la imagen del debuger dice con verdadero o falso, la comparación.

el problema es que m.PrecioB se genera de un CAST() esta función no redondea cuando transforma sino que corta, pero deja guardado el resto de los decimales, aunque no se vean,

o sea Yo corto cast( variabes as n(11,2) ) y en realidad tiene guardado en algún lado que el número original es con 4 decimales.
si uso el round luego del cast, entonces toma esa parte invisible, que no debería estar porque el cast dice 11,2, y si redondea tanto en esa parte invisible como lo que vemos.

Daniel Sánchez

unread,
Mar 25, 2016, 3:30:19 PM3/25/16
to Mundo Visual FoxPro
Me parece que estas comparando campos caracteres y no numéricos, por ahi viene tu problema no es lo mismo su fuera caracteres

"150.80" no es igual a "   150.80"

Ahora si ambos son numéricos si serian iguales

150.80=150.80

Saludos

--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Carlos Miguel FARIAS

unread,
Mar 25, 2016, 3:48:45 PM3/25/16
to mundovisualfoxpro
Ese valor te lo muestra directamente, o lo muestras a través de algún programa utilitario o control?
Porque deberías visualizar los valores sin ninguna "máscara".
Por ejemplo, si guardas 1/10, esa fracción no tiene equivalente exacto en binario (que es como manejan los datos internamente los sistemas) por lo que dependiendo de la precisión del tipo de dato con el que estás gestionando dichos valores, puede cambiar la representación internar y lo que se ve (adaptado por la interfaz) es distinto a lo que se almacena, y de ahí las diferencias.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe.

Alex Field

unread,
Mar 26, 2016, 7:06:46 PM3/26/16
to Mundo Visual FoxPro
Los dos campos son numéricos lo muestra la imagen del debuger, 
estoy usando el debuger de fox que muestra los valores que tomo de una planilla excel,
el tema es que el cast recorta no redondea, y devuelve con los decimales que le pedis
pero en realidad la variable contiene mas decimales en forma invisible

m.Precio  = 150.4080
m.PrecioB = cast( m.Precio as n(11,2) )
? m.precioB -> 150.40
muestra con dos decimales pero si lo comparás con 150.40 da distinto porque el cast lo recorta visualmente pero en realidad la variable sigue con los 4 decimales
hay que usar el round luego del cast

Fernando D. Bozzo

unread,
Mar 28, 2016, 3:15:17 AM3/28/16
to Mundo Visual FoxPro
Lo podrías solucionar como puso Fidel, usando ROUND(), y ahí ya no hay decimal extra que valga.

Alex Field

unread,
Mar 28, 2016, 4:28:46 PM3/28/16
to Mundo Visual FoxPro
Si así lo arregle, dejé el comentario por si le sirve alguno que le pase lo mismo.
Reply all
Reply to author
Forward
0 new messages