none
Redondeo con Round()

    Pregunta

  • What.... El resultado es el mismo, pero el numero original tiene 0.01 unidad de diferencia. Alguien me puede explicar esto???

     

        Y = Round((3.955), 2)  --> 3.96
        X = Round((3.965), 2)  --> 3.96  ???

     

    Saludos

    viernes, 08 de febrero de 2008 12:48

Respuestas

  • Existe un enlace de Microsoft muy interesante sobre todo el tema del redondeo bancario y otros temas relacionados. Incluye el código fuente para VB6 de funciones alternativas para conseguir los resultados que buscas.

    http://support.microsoft.com/?kbid=196652

     

    Por cierto, cuando hablamos de VB es importante que concretemos si hablamos de .NET o no, nos ahorramos mucho tiempo todos Wink

     

    Salud y suerte!

    miércoles, 13 de febrero de 2008 8:21
    Moderador

Todas las respuestas

  •  ssicom Escribió:

    What.... El resultado es el mismo, pero el numero original tiene 0.01 unidad de diferencia. Alguien me puede explicar esto???

     

        Y = Round((3.955), 2)  --> 3.96
        X = Round((3.965), 2)  --> 3.96  ???

     

    Saludos

     

    Hola, a ver si puedo ayudar,

     

    si la respuesta es lo que estas buscando no olvides de marcarla como correcta para cerrar el hilo!

     

    La función Round viene con un redondeo por defecto (unbiased), que cuando es impar redondea hacia arriba, y cuando par hacia bajo.

    La norma IEEE 754 dice que el redondeo por default es por proximidad "unbiased".
    Si un número es equidistante entre dos posible, el redondeo es hacia el valor par.
    Si el número es  par no se suma nada y si fuese impar se suma 1 en la posición menos
    significativa.

     

    Prueba lo siguiente modelo en un proyecto de consola, seguramente lo verás mas gráficamente.

    Code Snippet

    Module Module1

    Sub Main()

    Console.WriteLine("3.915 = " & Math.Round(3.915, 2))

    Console.WriteLine("3.925 = " & Math.Round(3.925, 2))

    Console.WriteLine("3.935 = " & Math.Round(3.935, 2))

    Console.WriteLine("3.945 = " & Math.Round(3.945, 2))

    Console.WriteLine("3.955 = " & Math.Round(3.955, 2))

    Console.WriteLine("3.965 = " & Math.Round(3.965, 2))

    Console.WriteLine("3.975 = " & Math.Round(3.975, 2))

    Console.WriteLine("3.985 = " & Math.Round(3.985, 2))

    Console.WriteLine("3.995 = " & Math.Round(3.995, 2))

    Console.WriteLine("3.915 = " & Math.Round(3.915, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.925 = " & Math.Round(3.925, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.935 = " & Math.Round(3.935, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.945 = " & Math.Round(3.945, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.955 = " & Math.Round(3.955, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.965 = " & Math.Round(3.965, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.975 = " & Math.Round(3.975, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.985 = " & Math.Round(3.985, 2, MidpointRounding.AwayFromZero))

    Console.WriteLine("3.995 = " & Math.Round(3.995, 2, MidpointRounding.AwayFromZero))

    Console.ReadKey()

    End Sub

    End Module

     

     

    Saludos,

    viernes, 08 de febrero de 2008 13:53
  • Hola, realmente te agradezco la explicacion y he podido comprobarlo, aunque en realidad lo que sería realmente de utilidad es que se pudiera solucionar este problema, en el código que me adjuntas utilizas el math.round con 3 parametros y en el visual Basic que utilizo sólo permite 2, será por que es versión 6???, que solución hay para esta versión.

     

    Saludos.

    miércoles, 13 de febrero de 2008 3:55
  • Existe un enlace de Microsoft muy interesante sobre todo el tema del redondeo bancario y otros temas relacionados. Incluye el código fuente para VB6 de funciones alternativas para conseguir los resultados que buscas.

    http://support.microsoft.com/?kbid=196652

     

    Por cierto, cuando hablamos de VB es importante que concretemos si hablamos de .NET o no, nos ahorramos mucho tiempo todos Wink

     

    Salud y suerte!

    miércoles, 13 de febrero de 2008 8:21
    Moderador
  • Gracias Toni, he encontrado la respuesta que buscaba en el Link que me indicas.

     

    Saludos

    miércoles, 13 de febrero de 2008 19:20
  •  ssicom Escribió:

    Gracias Toni, he encontrado la respuesta que buscaba en el Link que me indicas.

     

    Saludos

     

    Pense que lo había logrado explicar

    De todas formas me alegra que hayas llegado a lo que buscabas

     

    Chau Felicidades!!!

    miércoles, 13 de febrero de 2008 19:41
  • hola tengo una duda kiero redondear a 3 cifras los elementos contenidos en una list lo tengo asi...

     

    For i = 0 To ni - 1

    lstAle.Items.Add(ordenada(i) / 10000)

    redondea(i) = round(lstAle.Items.Item(i), 3)

    Next

     

     

    lstALe= contiene los datos que kiero redondear

    ordenada= es un arreglo con valores ordenados los cuales se suponen son de 4 cifras por ejemplo 2124 y lo que kiero es q me lo imprima en la lstAle como .214

     

    me pueden desatorar porfavor??

    lunes, 21 de abril de 2008 22:43
  • una opcion puede ser crear tu propia funcion redondear un ejemplo es esto:

    Private Function Redondear(valor As Double) As Double
        Dim p_entera As Integer
        Dim p_dec As Integer
        Dim valor_ing As Double
        Dim valor_ing2 As Double
        Dim cero As String
        cero = ""
        valor_ing = valor
        
        p_entera = Fix(valor_ing)
        valor_ing = valor_ing - CDbl(p_entera)
        valor_ing2 = valor_ing * 1000
        'p_dec = Fix(valor_ing)
        'If valor_ing < 0.1 Then cero = "0"
        If valor_ing2 Mod 10 >= 5 Then valor_ing = valor_ing + 0.01
        If Len(CStr(valor_ing)) > 4 Then
            valor_ing = CDbl(Mid(CStr(valor_ing), 1, 4))
        End If
        Redondear = CDbl(p_entera + valor_ing)
       
       
       
    End Function

    claro esta solo redondea a dos decimales habria que hacer siertos cambios pa que redondee a otros decimales

    a y no esta muy optimizada hay algunas variables que ni se utilizan pero si funciona
    • Editado HarviHernan domingo, 20 de noviembre de 2011 19:48
    • Propuesto como respuesta HarviHernan domingo, 20 de noviembre de 2011 19:48
    domingo, 20 de noviembre de 2011 19:42