none
Hacer bien una división con decimales RRS feed

  • Pregunta

  • Hola:

    Tengo unos cálculos

    cotización del 15/04/2019
    1 EUR (euro)=1,1200 USD (dólares estadounidenses) - 25,5200 CZK (coronas checas)
    Importe: 776,00 IVA: 0,00% 0,00 Total: 776,00 USD (dólares estadounidenses)
    692,86 EUR (euros) - 17.681,71 CZK (coronas checas)

    Para el importe en coronas checas (17.681,71) hago el siguiente cálculo

    importe en usd (776) / cotización euro/dólar (1,12) * cotización czk (25,5200) 

    Y me da 17.681,71428

    En cambio si hago el mismo cálculo por diferente vía

    euros (692,86) * cotización czk (25,5200)

    En teoría da lo mismo, pero me da 17.681,7872

    Con lo que concluyo que hay un error de decimales.

    Yo todos los importes los tengo importe as decimal

    El error que veo es que internamente tiene 4 decimales. Si redondeo a dos decimales

    litimporte2.Text = Format(e.Item.DataItem(0) * (1 + e.Item.DataItem(1) / 100) / deccotizacion, "n2") & " " & strmoneda2


    entonces  me come el resto de decimales y no hace bien el cálculo.

    ¿Cómo hago para que guarde dos decimales, y haga el cálculo bien

    Muchísimas gracias por la ayuda

    Ahora pongo

     litimporte2.Text = Format(Math.Round(e.Item.DataItem(0) * (1 + e.Item.DataItem(1) / 100) * deccotizacion, 2, MidpointRounding.ToEven), "n2") & " " & strmoneda2
    : 

    Y hace el mismo cálculo.

    ¿No puedo hacer que todos los cálculos sea sobre números de dos decimales en vez de 4 que tiene si declaro la variable as decimal? Tal como hacemos con el euro, siempre con dos decimales.

    Muchísimas gracias.

    Redondear a dos decimales lo hace bien, pero sigue siendo un número de 4 decimales, que es lo que multiplica.

    Lo puedo dejar tal como está, pero supongamos que sea un importe de miles. Cuanto mayor sea la cantidad, mayor desviación por decimales.

    ¿No se puede declarar una variable con dos decimales, por ejemplo?. Algo como as decimal(8,2), como en sql server.










    • Editado volar.2016 viernes, 29 de noviembre de 2019 12:20
    viernes, 29 de noviembre de 2019 10:49

Todas las respuestas

  • El en segundo cálculo es menos preciso porque trabajas con menos decimales.

    Puedes hacer el cálculo

    Dim Resultado as Decimal = importe en usd (776) / cotización euro/dólar (1,12) * cotización czk (25,5200) 

    y redondear el resultado a dos decimales haciendo

    Math.Round(Resultado, 2, MidpointRounding.ToEven)


    Saludos, Javier J

    viernes, 29 de noviembre de 2019 11:17