Visual Basic - Trabajar con decimales

Life is soft - evento anual de software empresarial
 
Vista:

Trabajar con decimales

Publicado por Jota (4 intervenciones) el 04/01/2006 20:58:41
Hola ke tal... estoy realizando un programa ke maneja calificaciones de alumnos... pero a la hora de promediar dichas notas... si algun resultado es por ejemplo 10,5... ese 10,5 kisiera redondearlo hacia arriba para obtener un 11.... visual basic permite llevar al numero superior inmediato si el decimal es de 6 a 9... pero si es 5 como en el caso planteado lo lleva al numero inferior inmediato: 10. ¿Cómo puedo llevar un numero con decimal mayor ó igual a 5 al numero superior...?

PD: ya he utilizado las funciones VAL, FIX y INT y no me funcionan, el 10, 5 es llevado a 10 y no a 11 como lo deseo... agredezco su ayuda de antemano... =)
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

RE:Trabajar con decimales

Publicado por ivan (463 intervenciones) el 05/01/2006 02:46:32
Lo único que se me ocurre es que tú mismo edites el resultado. lo conviertas a string y saques el último caracter, luego lo conviertas a número, para que ya hagas tu mismo la evaluación.

Si este valor es capturado por el usuario, valida que solamente te capture un decimal, si acaso es calculado, valídalo tu mismo.. ya sea truncándolo o redondeándolo (del 5 para arriba se va a la unidad)

Suerte
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

RE:Trabajar con decimales

Publicado por Petter.pe (36 intervenciones) el 05/01/2006 03:27:57
Hola, puedes utilizar la función 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

RE:Trabajar con decimales

Publicado por low (102 intervenciones) el 05/01/2006 08:37:27
A ver, una sugerencia, que tal si el numero acaba en .5 le añades una décima y luego lo redondeas?

Esto traducido sería

If NumDecimal - Round(NumDecimal) = 0.5 Then NumDecimal = NumDecimal + 0.1
Entero = Round(NumDecimal)

Un saludo
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

RE:Trabajar con decimales

Publicado por Petter.pe (36 intervenciones) el 05/01/2006 17:18:27
Hola, algo así te iba a sugerir, que le añadas una cantidad decimal que no influya en la cifra a redondear. Se redondea para arriba a partir que la cifra decimal es mayor que 5 en su posición decimal.

Por ejemplo si quieres redondear a entero:

un 10.5 bastaría podrías sumarle 0.01 o 0.0001

Private Sub Command1_Click()

Me.Text2.Text = Round(Val(Me.Text1.Text) + 0.000001)


End Sub

Por ejemplo un 10.5 quedaria sumado
10.5000001

Round(10.5000001)= 11

Ello afectará a la última posición decimal

La función Round te permite definir a la cantidad de decimales que deseas redondear por defecto es cero.

Un 10.49 redondeado a un decimal es 10.5
Round(10.49,1)=10.5
y redondeado a entero 11

Asi deberías redondear a la cantidad de decimales inmediatamente inferior hasta que no hayan decimales.
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

RE:Trabajar con decimales

Publicado por perla (1 intervención) el 10/03/2013 02:19:29
Me sirvio mucho este codigo y lo adapte a visual .net 5 y me salieron los valores que deseaba les paso el codigo

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
'Este codigo redondea a enteros y valida el numero 0.50
Dim numdecimal As String
Dim total As Integer
Dim x As Integer

x = numero.Text
numdecimal = numero.Text - x

If numdecimal = 0.5 Then
total = numero.Text + 0.1
TextBox5.Text = total & " 00 "
Else
total = numero.Text
TextBox5.Text = total & " 00 "
End If

End Sub
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

Prueba esta función

Publicado por Zoto (55 intervenciones) el 05/01/2006 17:15:51
Saludos, Jota.

He creado una simple función para obtener el resultado que deseabas inspirándome en las respuestas anteriores a este hilo.
La he llamado RoundAdv (Round Advanced) puesto que admite un parámetro más que la tradicional Round: permite seleccionar el valor de la cifra que determina el redondeo (por defecto 5), es decir, si el número es el 10,5 devuelve 11 porque la cifra que determina el redondeo es igual o mayor a 5.

Aquí os la doy. Como veréis la función es bastante simple (tan solo 2 líneas de código), pero está comentada exhaustivamente:

'-----------------------------------------------
'CÓDIGO
'-----------------------------------------------

'Zoto - www.lawebdelprogramador.com
'Descripción: Función de Redondeo Avanzada.

'Esta función toma como parámetros:

'-NumRound-> Double que contiene el número a redondear
'-NumDigitsAfterDecimal-> Byte que contiene el número de
'dígitos decimales que deben conservarse al redondear.
'Por ejemplo, si el número a redondear es 12,456
'y este parámetro (NumDigitsAfterDecimal) es 2,
'entonces se redondea a 12,46 (si el tercer parámetro,
'que se comenta a continuación, es igual o mayor que 6)
'-CiphreAdd-> Byte que contiene la cifra que determina el redondeo (si
'la cifra decimal que ocupa la posterior posición a la
'determinada por NumDigitsAfterDecimal es igual o mayor
'que este parámetro (CiphreAdd) se añade una unidad
'a la cifra que le precede.
'Por ejemplo, si el número a redondear es 12,456 ,
'NumDigitsAfterDecimal es 2 y este parámetro (CiphreAdd) es
'5 (valor por defecto), entonces se comprueba que la siguiente cifra decimal a
'la indicada en NumDigitsAfterDecimal (que es la tercera, ya
'que NumDigitsAfterDecimal apunta a la segunda)
'es igual o superior a CiphreAdd y, consecuentemente, se añade
'una unidad a la cifra anterior: 12,456 -> 12,46

Function RoundAdv(ByVal NumRound As Double, Optional NumDigitsAfterDecimal As Byte, Optional CiphreAdd As Byte = 5) As Double
NumRound = NumRound * 10 ^ NumDigitsAfterDecimal
RoundAdv = (Int(NumRound) + Abs(CiphreAdd / 10 <= NumRound - Int(NumRound))) / 10 ^ NumDigitsAfterDecimal
End Function

'----------------------------------------------------------------------------------
'Ejemplo de uso:

'Dim n As Double 'Número a redondear
'Dim d As Byte 'Cifras decimales a incluir
'Dim c As Byte 'Valor de la cifra a tomar como partida de redondeo (por defecto 5)

'n = CDbl(InputBox("Introduce el número a redondear:", "RoundAdv", "12,456"))
'd = CInt(InputBox("Introduce el número de dígitos decimales a partir de los cuales se debe redondar (p.e. para redondear 2,456 -> a 2,45 / 2,46 el número debería ser 2)", "RoundAdv", "2"))
'c = CInt(InputBox("Introduce el número que debe tener la cifra que determine el redondeo (si no especifica es 5, es decir, el número 2,456 se redondea a 2,46 (siendo el parámetro anterior 2) por que 6 es igual o mayor que la cifra 5 (valor por defecto)", "RoundAdv", "5"))

'MsgBox "Número redondeado: " & RoundAdv(n, d, c), , "RoundAdv-Calculado"
'----------------------------------------------------------------------------------

Espero que te sirva a ti y a otros (y espero no haberme pasado con los comentarios... ;D)

Hasta pronto,

Zoto
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

RE:Trabajar con decimales

Publicado por Jota (4 intervenciones) el 05/01/2006 19:38:45
Pues debo agradecerles porke sus ayudas me sirvieron, les explico por si les toca alguna experiencia parecida:

La idea de zoto es viable lo felicito por su aplicacion, pero como yo debo realizar promedio de notas y a ese resultado es cual debo redondear al numero superior inmediato en caso de ser su decimal igual o mayor de ke 5... tome la idea de ivan, petter y low:

La idea principal fue tomar ese resultado, por ejemplo dos text a los ke se iban a promediar y sumarles 0.01 de la siguiente forma:

Private Sub Command1_Click()
Text3 = Round(((Val(Text1) + Val(Text2)) / 2) + 0.01)
End Sub

Esto lo hacia perfecto!.. ya ke al promediar

text1 = 10
y
text2 = 11

el resultado es 10.5 y lo lleva a 11 sin problemas... pero luego me di cuenta ke en el supuesto caso de ke las notas varien con decimales, me explico:

Si (text1 = 10.4) y (text2 = 10.5) el promedio de ellos seria

(text1 + text2)/ 2 = text3

(10.4 + 10.5)/2 = 10.45

matematicamente, al redondear el numero 10.45 deberia ser igual a 10.5 y por ende entonces 11... esto visual basic no lo hace con la llinea de comando antes comentada... pekeños detalles ke aveces visual nos complica la vida...

entoncs le sume 0.06... cifra ke trucadamente lleva el 10.45 a 10.51 y entoncs al redondearlo: 11... problema resuelto... millon de gracias!!! estamos en contacto.... =)
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