none
Problemas con redondeo vb.net RRS feed

  • Pregunta

  • Hola a todos!

    Estoy con el desarrollo de un pequeño sistema en el cual tengo problemas con el tema del redondeo de los decimales al momento de almacenarlos, el numero se genera de la multiplicacion de 2 campos con 4 decimales cada uno, por lo que como solo necesito almacenar 2 decimales hago el redondeo a solo 2 y en este proceso es q m ocurre el percance, por ejemplo:

    Actualmente uso este codigo para hacer la multiplicacion y redondear el resultado.

    Dim valor As Decimal = fila.Cells(10).Value
                        Dim valor1 As Decimal = fila.Cells(11).Value
                        Dim valorusd As Decimal = valor * valor1
    
                        valorusd = Decimal.Round(valorusd, 2, MidpointRounding.ToEven)


    El numero 4,5454 me lo deja como 4,54

    Como puedo hacer para que me haga un redondeo de si es iual o mayor a 5 q redondee al prox numero y si no que lo deje tal cual...



    jueves, 14 de marzo de 2013 17:29

Respuestas

  • Listo gente ya puse encontrar la solucion a mi problema... aqui les dejo la solucion con el problema planteado... Muchas Gracias por su ayuda!

    ________________________________________________________________________________________________________________________

    La función Round() no redondea bien para los números de la forma (2a + 0,5) x 10^-n (redondeados hacia abajo)
    En cambio, los números de la forma (2a - 0,5) x 10^-n normalmente son bien redondeados hacia arriba.

    Por ejemplo:

    Round(0.15 , 1) = 0.2
    Round(0.25 , 1) = 0.2
    Round(0.35 , 1) = 0.4
    Round(0.45 , 1) = 0.4

    La función Redondeo que veremos a continuación no presenta este problema:

    Redondeo(0.15 , 1) = 0.2
    Redondeo(0.25 , 1) = 0.3
    Redondeo(0.35 , 1) = 0.4
    Redondeo(0.45 , 1) = 0.5

    Private Function Redondeo(ByVal Numero, ByVal Decimales)  
          Redondeo = Int(Numero * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales  
    End Function

    • Editado Pedrez jueves, 14 de marzo de 2013 19:59
    • Marcado como respuesta Pedrez jueves, 14 de marzo de 2013 20:02
    jueves, 14 de marzo de 2013 19:58

Todas las respuestas

  • porque no usas el

    Math.Floor Method (Decimal)

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 14 de marzo de 2013 17:51
  • Como se usa eso? y disculpa la molestia.
    jueves, 14 de marzo de 2013 18:25
  • no has revisado el link, alli muestra un ejemplo

    es solo usar el metodo de la clase

    Dim result as Decimal = Math.Floor(valorusd)


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 14 de marzo de 2013 18:27
  • Disculpa por no haberlo leido antes pero no me habia dado cuenta del link... Por lo que veo esa no seria la solucion a mi problema ya que siempre estaria redondiando hacia abajo, es decir, si un numero es 0.8 igual seria 0... el problema que tengo es que si el decimal es igual o mayor a 5 me lleve al otro numero si no lo es que lo deje asi... por ejemplo

    2,5 deberia ser 3 pero queda como 2...

    jueves, 14 de marzo de 2013 18:37
  • Pues a mi me devuelve 4,55 

        Dim valorusd As Decimal = 4.5454D
        MsgBox((Decimal.Round(valorusd, 2, MidpointRounding.ToEven)).ToString)

    jueves, 14 de marzo de 2013 18:39
  • Ese monto lo puse como ejemplo pero prueba con este que si es un monto que me esta dando problema.
    89291,485

    jueves, 14 de marzo de 2013 18:59
  • Con:

        Dim valorusd As Decimal = 89291.485D
        MsgBox((Decimal.Round(valorusd, 2, MidpointRounding.AwayFromZero)).ToString)
    Devuelve 89291,49



    "Option Strict On" no es opcional, es necesario.

    jueves, 14 de marzo de 2013 19:18
  • pero si has revisado la documentacion veras que ademas del Floor tienes el

    Math.Ceiling(Decimal)

    entocnes es ese el que buscas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 14 de marzo de 2013 19:46
  • Listo gente ya puse encontrar la solucion a mi problema... aqui les dejo la solucion con el problema planteado... Muchas Gracias por su ayuda!

    ________________________________________________________________________________________________________________________

    La función Round() no redondea bien para los números de la forma (2a + 0,5) x 10^-n (redondeados hacia abajo)
    En cambio, los números de la forma (2a - 0,5) x 10^-n normalmente son bien redondeados hacia arriba.

    Por ejemplo:

    Round(0.15 , 1) = 0.2
    Round(0.25 , 1) = 0.2
    Round(0.35 , 1) = 0.4
    Round(0.45 , 1) = 0.4

    La función Redondeo que veremos a continuación no presenta este problema:

    Redondeo(0.15 , 1) = 0.2
    Redondeo(0.25 , 1) = 0.3
    Redondeo(0.35 , 1) = 0.4
    Redondeo(0.45 , 1) = 0.5

    Private Function Redondeo(ByVal Numero, ByVal Decimales)  
          Redondeo = Int(Numero * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales  
    End Function

    • Editado Pedrez jueves, 14 de marzo de 2013 19:59
    • Marcado como respuesta Pedrez jueves, 14 de marzo de 2013 20:02
    jueves, 14 de marzo de 2013 19:58