none
Distinto resultado si el dato lo cojo de label a si lo pongo manual RRS feed

  • Pregunta

  • Buenas tengo este problema al coger datos de un label me da resultado diferente a si lo pongo manual el dato alguna solucion

    Gracias

    Si lo pongo a si me sale este resultado que es incorrecto 7.92 en este caso los datos los coge de label

    Label89.Text = FormatNumber((L_Galones_Macerado.Text * 4) / libras, 2) & " qt/lb"

    y si lo pongo de est manera me sale correcto  que es 7.20

    Label89.Text = FormatNumber((3.96 * 4) / 2.2, 2) & " qt/lb"

    viernes, 17 de febrero de 2017 16:09

Respuestas

  • Ah, acabas de caer en la trampa de las conversiones implicitas de Visual Basic. Es algo a evitar porque te llevas la sorpresa de cosas que no funcionan como deberian.

    En este caso particular hay una conversion implicita de String a Integer en donde pones L_Galones_Macerado.Text * 4. Fijate que el * es una multiplicacion y requiere dos numeros, pero a la izquierda hay un .Text que es un String, luego necesita convertirlo a numero. El tipo de numero se infiere a partir del valor de la derecha (4) que resulta ser entero, luego el compilador genera una conversion del .Text a numero entero. Cuando despues en tiempo de ejecucion le tecleas un numero con decimales, se desprecian los decimales al convertirlos a entero.

    Por eso arroja un valor distinto que (3.96 * 4), en donde se ve que uno de los numeros es de coma flotante y en consecuencia realiza una multiplicacion en coma flotante en lugar de multiplicar Integer; por lo tanto, no se pierden los decimales.

    Para que no te pasen estas cosas, descactiva las conversiones implicitas poniendo un "Option Strict On" al principio del programa. De esta manera te dara un error cuando tengas una conversion implicita como la que acabamos de ver. Entonces metes a mano la correspondiente conversion Explicita, y asi sabes seguro que se convierte al tipo que tu quieres:

    Label89.Text = FormatNumber((Convert.ToDouble(L_Galones_Macerado.Text) * 4) / libras, 2) & " qt/lb"


    • Editado Alberto PoblacionMVP viernes, 17 de febrero de 2017 16:23
    • Marcado como respuesta JETET viernes, 17 de febrero de 2017 17:17
    viernes, 17 de febrero de 2017 16:22

Todas las respuestas

  • Ah, acabas de caer en la trampa de las conversiones implicitas de Visual Basic. Es algo a evitar porque te llevas la sorpresa de cosas que no funcionan como deberian.

    En este caso particular hay una conversion implicita de String a Integer en donde pones L_Galones_Macerado.Text * 4. Fijate que el * es una multiplicacion y requiere dos numeros, pero a la izquierda hay un .Text que es un String, luego necesita convertirlo a numero. El tipo de numero se infiere a partir del valor de la derecha (4) que resulta ser entero, luego el compilador genera una conversion del .Text a numero entero. Cuando despues en tiempo de ejecucion le tecleas un numero con decimales, se desprecian los decimales al convertirlos a entero.

    Por eso arroja un valor distinto que (3.96 * 4), en donde se ve que uno de los numeros es de coma flotante y en consecuencia realiza una multiplicacion en coma flotante en lugar de multiplicar Integer; por lo tanto, no se pierden los decimales.

    Para que no te pasen estas cosas, descactiva las conversiones implicitas poniendo un "Option Strict On" al principio del programa. De esta manera te dara un error cuando tengas una conversion implicita como la que acabamos de ver. Entonces metes a mano la correspondiente conversion Explicita, y asi sabes seguro que se convierte al tipo que tu quieres:

    Label89.Text = FormatNumber((Convert.ToDouble(L_Galones_Macerado.Text) * 4) / libras, 2) & " qt/lb"


    • Editado Alberto PoblacionMVP viernes, 17 de febrero de 2017 16:23
    • Marcado como respuesta JETET viernes, 17 de febrero de 2017 17:17
    viernes, 17 de febrero de 2017 16:22
  • 1000 gracias por responder 

    al final lo he solucionado poniendo la variable en decimal

    'EMPASTE
            Dim Kilos As Decimal = Label68.Text
            Dim libras As Decimal = Label72.Text
            'MsgBox(libras)
            Dim LGM As Decimal = FormatNumber(N_Agua_Macerado.Value / 3.785412, 2)
            If Kilos = 0 Then
            Else
                Label86.Text = FormatNumber(N_Agua_Macerado.Value / Kilos, 2) & " l/kg"
                Label89.Text = FormatNumber((L_Galones_Macerado.Text * 4) / libras, 2) & " qt/lb"
                'Label89.Text = FormatNumber((3.96 * 4) / 2.2, 2) & " qt/lb"
            End If
    
            'EMPASTE
    

    viernes, 17 de febrero de 2017 17:18