Redondeo con Round()
-
viernes, 08 de febrero de 2008 12:48
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
Todas las respuestas
-
viernes, 08 de febrero de 2008 13:53
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 SnippetModule
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 SubEnd
ModuleSaludos,
-
miércoles, 13 de febrero de 2008 3:55
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 8:21Moderador
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

Salud y suerte!
-
miércoles, 13 de febrero de 2008 19:20
Gracias Toni, he encontrado la respuesta que buscaba en el Link que me indicas.
Saludos
-
miércoles, 13 de febrero de 2008 19:41
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!!!
-
lunes, 21 de abril de 2008 22:43
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??
-
domingo, 20 de noviembre de 2011 19:42
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 Functionclaro 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


