Spanish Consulta sobre BigDecimal (Solucionado)

CarlosR

Member
Licensed User
Longtime User
Soy nuevo utilizando Basic4Android, IGUALMENTE novato en programación. Estoy tratando de desarrollar Una Pequeña application. This Sub Funciona CUANDO el valor de i es entero Número ONU, coloco CUANDO Pero la onu del numero decimal, No funciona. Aparentemente, Debo Trabajar Con BigDecimal o BigInteger párr Obtener sin valor Preciso Que Haga CIERTA La Igualdad, Pero no se como Hacerlo. Si Alguien Pudiera ayudarme, lo agradeceria, si ESTO el Código utilizado No Es desastre un.

Sub btnCalcular_Click
.....

Dim Variab1, Variab2, Variab3 As Double 'Esta Declarada En Sub Globals

Dim i As Double 'Esta Declarada En Sub Globals

i = (0,1)

Do Until (Variab1 * i) = (Variab2/Variab3)

Resultado = (Variab2 / Variab3) / (Variab1)

i = (i + 0,1)

Bucle

edtResultado.Text = Resultado
.....

End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola CarlosR

Primero que la verdad no entendi exactamente cual es el problema, creo que no hablas español ya que el do loop lo has traducido como Bucle (y es el loop), y los decimales en B4A se ponen con punto (.), no coma (,) por otro lado si no pones los valores iniciales de las variables es dificil hacerse a la idea por que no hace lo que tu quieres.

Creo entender que dices que la condición cuando es un decimal nunca se cumple pero si cuando es entero, esto es normal, una parte de la comparacion podria ser 1.23 y la otra 1.2356789 y claro, aunque te lo parezca no es lo mismo.
Yo te recomiendo que la comparacion la hagas con NumberFormat , y le digas hasta cuantos decimales quieres comparar, de esta forma compararás dos valores con la misma cantidad de decimales.

Como recomendación para encontrar errores te dire lo de siempre, pon LOG y podras ver que es lo que está pasando, y si ademas corres el programa pasa a paso en modo Debug(rapid) podras ver en todo momento que es lo que hace y por que no se cumple lo que tu quieres.
Por otro lado en el bucle pon un DoEvents, por que si el bucle es largo te comerá todos los recursos y te dejará el movil muerto. Y tambíen pon una variable global, que si la cambias salgas del bucle, esto te valdrá por si el usuario quiere salir del programa y está dentro del bucle.

Saludos
 

CarlosR

Member
Licensed User
Longtime User
Bgsoft de Hola (Jesús)
Gracias por tu Respuesta.
En Realidad si hablo español, es mi lengua natural, (soy de Venezuela). Razón Alguna Por, Escribo CUANDO el Mensaje aparece distorcionado Al Momento de remitirlo. SONDA Con El NumberFormat y estafa el de depuración (rápido), y sí puedo OBSERVAR Que el valor de i, Una Vez Realizado el Cálculo, de como aparece debe ser (en El Ejemplo debe Ser 10). Sin embargo, Este valor no sí ve reflejado en el edtResultado.text. A continuacion coloco Lo Que Estoy Haciendo una versión Si Puedes orientarme párr resolver el Problema.

Sub Globals

Dim editCantEnt Como EditarTexto
Dim Resultado As Double
Dim btnCalcular Como Button
Dim Variab1, Variab2, Variab3 As Double
Dim i As Double

End Sub

Sub btnCalcular_Click

i = NumberFormat2 (i, 0, 3, 3, False)

i = (0,1)

'Variab1 = 300
'Variab2 = 9000
'Variab3 = 3

Do Until (Variab1 * i) = (Variab2/Variab3)

Resultado = (Variab2 / Variab3) / (Variab1)

i = (i + 0,1)

Bucle

edtResultado.Text = Resultado

End Sub

De Cuando utilizo el de depuración (Rapid) Obtengo lo siguiente:

Valor de i: 0.1
Valor de Resultado: 10.0
Varlor de Variab1: 300.0
Varlor de Variab2: 9000.0
Valor de Variab3: 3.0

Aunque aparece el Valor de Resultado (10.0), Este No Se Refleja En El edtResultado.Text.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola CarlosR

Perdona si no te contesté antes pero estaba fuera.

Como decia Jack el destripador: "Vayamos por partes" :D


Te dije que pusieras la comparación con NumberFormat2, pero tu la haces en la variable "i" al principio del bucle que eso no hace nada y sigues dejando la comparación igual, por lo tanto el programa sigue igual, asi que los resultados son los mismos.
Yo te recomiendo que la comparacion la hagas con NumberFormat , y le digas hasta cuantos decimales quieres comparar, de esta forma compararás dos valores con la misma cantidad de decimales.

Te dije esto:
Como recomendación para encontrar errores te dire lo de siempre, pon LOG y podras ver que es lo que está pasando, y si ademas corres el programa pasa a paso en modo Debug(rapid) podras ver en todo momento que es lo que hace y por que no se cumple lo que tu quieres
Si corres el programa paso a paso, veras que la condición jamas llega a cumplirse, por eso no sale del bucle y por eso no te actualiza la etiqueta.

Si hubieses añadido estos logs, verias que la condicion no se cumple por que los decimales no son iguales:
B4X:
Log("Variab1 * i " & (Variab1 * i))
Log("Variab2/Variab3 " & (Variab2/Variab3))
Log("i " & i)
Log("Resultado " & Resultado)




Cambia la linea de comparación por esta y veras como te funciona:
B4X:
Do Until NumberFormat2(Variab1 * i,0,2,2,False) = NumberFormat2(Variab2/Variab3,0,2,2,False)
' El numero de decimales pon el que creas conveniente

Saludos
 

CarlosR

Member
Licensed User
Longtime User
Hola Bgsoft (Jesús)

Muchas Gracias por tu Respuesta.

Modifiqué las líneas de código tal como me sugeriste y ¡Funcionó!

Leeré un poco mas sobre el uso de LOG y NumberFormat. Por cierto, quiero aprovechar para consultar si existe un libro en español dedicado al Basic4Android y que sea bueno para principiantes (he bajado algunos Tutoriales). Se que hay uno en Inglés, que se puede comprar vía Internet, me gustaría conocer tu opinión sobre ese libro, en relación a si los temas que abarca son comprensibles para un principiante o si por el contrario, debería realizar otras lecturas previas.

De nuevo gracias. Saludos

CarlosR
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola CarlosR

Me alegra que hayas resuelto tu problema, ahora seria buen momento para que modifiques la cabecera y le añadas (Solucionado), de esa forma quien busque una respuesta como la tuya verá que ahi se resolvió.

Sobre los libros lamento no poder decirte nada, voy aprendiendo con los manuales de aqui y probando/equivocandome mucho.
Lo mejor es que abras un nuevo post y asi si hay alguien que lo haya comprado te podrá ayudar

Saludos
 
Top