Visual Basic.NET - Problemas con redondear

 
Vista:
sin imagen de perfil

Problemas con redondear

Publicado por Ricardo (4 intervenciones) el 31/10/2014 15:26:58
Buenos días,
Por favor podrían ayudarme?, tengo problemas con el redondeo en VB.NET, estoy usando una función para redondear, pero como puede verse en el ejemplo, no funciona bien. Porque se produce este error?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim t1 As Double
        Dim t2 As Double
        Dim x As Double
 
        t1 = 10.1
        t2 = 3.25
        x = t1 * t2  'este resultado da 32.825
 
        Debug.Print("mal calculado " & Redondeo(x, 2))
        Debug.Print("bien calculado " & Redondeo(32.825, 2))
    End Sub
 
    Private Function Redondeo(ByVal Numero, ByVal Decimales)
        Redondeo = Int(Numero * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales
    End Function
End Class
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de giancarlo
Val: 377
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con redondear

Publicado por giancarlo (488 intervenciones) el 31/10/2014 18:07:33
puedes suar ROUND() o MATH.ROUND
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con redondear

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 31/10/2014 20:39:41
Para qué reinventar la rueda?.

Lo que te dice giancarlo es lo correcto.

Ahora porqué no obtienes lo que deseas?

Primero, tienes una función llamada redondeo que no especificas qué es lo que devuelve

Segundo, lo que se devuelve en una función se debe hacer con un Return

Tercero, estás devolviendo un entero, entonces como pretendes obtener algo coherente?.

Utiliza las funciones del lenguaje que trae para redondeos.

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con redondear

Publicado por Ricardo (4 intervenciones) el 01/11/2014 00:39:57
Estimados Giancarlo y Patricio
Gracias por responder.
no uso las funciones round, porque es conocido (y lo he comprobado, pero además hay muchos foros sobre el problema que presenta) que no calculan bien con algunos números como por ejemplo:
Round(0.25 , 1) = 0.2 (cuando debiera devolver 0.3.

La función que yo he puesto, aún escribiendo con el return no calcula bien, he estudiado la lógica de la función y es correcta, es más funciona bien en el segundo debug.print que he puesto en el ejemplo...y sobre el otro tema; la función no devuelve un entero ya que el int(...) termina con una división... Espero sus comentarios.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de giancarlo
Val: 377
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con redondear

Publicado por giancarlo (488 intervenciones) el 03/11/2014 15:24:06
algo habia escuchado sobre redondeos, pero no me acordaba cual era el comando que redondeaba de esa manera.

si usas cint(), del x.0 al x.5 se convierte al numero entero, pero cuando es del x.500...1 en adelante, se convierte al numero posterior(aunque algunos casos no paso esto)
con convert.toint32( es lo mas proximo, a partir del x.5 ya es al numero posterior
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado su posición en 10 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con redondear

Publicado por Horroroso (55 intervenciones) el 06/11/2014 17:00:47
Este es un caso muy comun y ya muy visto con problemas de manejo de decimales.

Cambia tu funcion Redondeo a la siguiente:

1
2
3
Private Function Redondeo(ByVal Numero As Decimal, ByVal Decimales As Integer) As Decimal
        Return CDec(Int(Numero * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales)
End Function

y luego utiliza la funcion con numero decimale y listo.

Saludos

Horroroso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con redondear

Publicado por Ricardo (4 intervenciones) el 13/11/2014 21:38:50
Estimado horroroso.

Gracias, la función que has escrito funciona correctamente y devuelve los valores bien; pero por favor quisiera que me respondas un par de preguntas:
1) cuando cambio 'As Decimal' por 'As Double' [en la declaración: Private Function Redondeo(ByVal Numero As Decimal, ByVal Decimales As Integer) As Decimal)] deja de funcionar, porque?
2) por favor podrías decirme que es lo que hace la función CDec?

De antemano agradezco tu atención.

Saludos

Ricardo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con redondear

Publicado por Ricardo (4 intervenciones) el 13/11/2014 23:02:08
Estimado horroroso
Buenas tardes, no se que ocurre con el valor de 1.265 redondeado a 2 decimales con la función que has escrito, no calcula como debe ser, devuelve 1.26... a que se debe?

Agradezco de antemano tu respuesta.


1
2
3
4
5
6
7
8
9
10
11
12
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim t As Decimal
 
        t = Redondeo(1.265, 2)    'debería devolver 1.27
        Debug.Print(t)
    End Sub
 
    Private Function Redondeo(ByVal Numero As Decimal, ByVal Decimales As Integer)
        Return CDec(Int(Numero * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales)
    End Function
End Class
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar