Problema con los decimales

Tengo un problema con los decimales, si coloco un precio 13,39 y al sacarle el iva, y descuento, sale 1499,68
Como redondeo eso a 15 mis códigos están así:
Private Sub Text16_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
If IsNumeric(Text16) Then
Dim precio As Double
Dim iva As Double
Dim descuento As Double
Dim preiva As Double
Dim predesc As Double
descuento = Val(Text12) * (Val(Text13) / 100)
iva = Val(Text12) * (Val(Text14) / 100)
predesc = Val(Text12) - descuento
preiva = predesc + iva
precant = (precant) + preiva * Val(Text16)
Text19 = precant
Else
MsgBox "Error..Ingrese sólo Números", vbCritical + vbOKOnly, "Mensaje del Sistema"
Text16 = ""
Text16.SetFocus
End If
End If
End Sub
Me puedes ayudar en arreglar este código del problema que tengo con los decimales.

2 Respuestas

Respuesta
1
Te voy a ayudar con la idea de lo que debs mirar. Asumiendo que tu variable de resultado siempre maneje 2 decimales, puedes almacenar en una variable solo estos dos dígitos así:
decimales = right(VariableResultado,2)
De este modo ya tienes únicamente el valor decimal en esta variable y puedes hacer una función de redondeo según tus criterios, es decir para qué valores harías una función de techo (que redondee al entero más alto).
Por ejemplo:
Tu resultado te da 1499,68 - puedes decir que si los decimales (68) son mayores o iguales a 51 entonces al valor que queda (1499) le sume 1, así habrás redondeado ya a 1500, o que si es menor a 51 lo deje en 1499.
Ahora si tu no sabes cuantos decimales vas a tener entonces debes hacer una función que te vaya leyendo de derecha a izquierda cada carácter y lo vaya almacenando en otra variable hasta que encuentre la coma que separa los decimales:
Por ejemplo con 1499,689987 sería:
temp="" 
Entero = 1499,689987 
Do While right(Entero, 1) <> "," // asumiendo que tus decimales se separan con coma y no con punto
temp= temp + right(Entero, 1) //Concatena a la variable el último carácter de la derecha
Entero = left(Entero, len(Entero)-1) // Le quita a Entero el último carácter de la derecha
Loop 
Entero = left(Entero, len(Entero)-1) // Una vez más después del ciclo, para quitar la coma
Cuando termina este ciclo, en la variable Entero vas a tener el valor 1499 y en la variable temp vas a tener 789986 (tus decimales al revés), debes hacer que vuelvan a quedar en orden y luego si haces tu regla de si son mayores a al valor que desees le sume 1 o lo deje quieto.
En este ejemplo, comparar con 51 obviamente ya no te va a servir, pues obviamente 51 siempre va a ser menor que 689987... en este caso tendrías que comparar con 500001, es decir que debes comparar contra lo que sería la mitad más 1, de una unidad (una unidad en decimales, con 6 en este caso)
Para saber con qué numero debes comparar los decimales debes saber cuantos decimales tienes, en este caso tienes 6, por lo tanto el número con que comparas debe tener 6 también, el primero siempre 5, el último siempre 1 y los de la mitad (sean la cantidad que sean) siempre los rellenas con cero. Todo esto asumiendo que deseas redondear desde, 5
Respuesta

Función techo:

if (cint(tuNumero) < cdbl(tuNumero) then tuNumero = cint(tuNumero) +1

Me sobran dos ces:

if (int(tuNumero) < cdbl(tuNumero) then tuNumero = int(tuNumero) +1

:D

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas