Comunidad de diseño web y desarrollo en internet online

[Excel] Error condicional con VB

Citar            
MensajeEscrito el 25 Mar 2014 01:17 pm
Hola qué tal,

Este es el codigo:

Código :

Function MiRedondeo(numero As Double) As Double
  Dim entero As Long
  Dim decima As Double
  entero = Int(numero) 'Obtenemos el entero
  decima = numero - entero 'Obtenemos la parte decimal

'Hacemos un condicional
If decima = 0.3 Then
 MiRedondeo = 1
Else
 MiRedondeo = 0
End If
End Function


Así, sin mas complicaciones lo que debería hacer es que si mi numero dado tiene un decimal igual a 0.3 ese numero se convierte en 1, pero no lo hace, bueno sí lo hace, unicamente para los numeros 0.3 y 1.3 para cualquier otro numero, digase 2.3, 33.3, 104.3 me devuelve 0 (cero).

WTH!
Me gustaría saber que pedo, porqué hace eso, como lo soluciono?

Saludos y gracias de antemano

Por holler

65 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 May 2014 09:58 pm
Hola,
el problema es que no se pueden comparar números en coma flotante cuando has hecho operaciones sobre alguno de ellos. Los números en coma flotante no se representan de forma exacta en binario, y por eso al hacer cálculos siempre hay un pequeño error. La salida que te da excel no lo representa porque el error es despreciable, pero aunque no lo parezca después de hacer sumas, restas, etc los números no son exactamente iguales.

Si ejecutas esta macro verás lo que te digo:

Código :

Sub CompararFlotantes()
    Dim a As Double, b As Double, c As Double
    a = 0.3
    b = 0.3
    c = 1.3 - 1
    MsgBox a = b 'Verdadero
    MsgBox a = c 'Falso
End Sub


Para solucionarlo, lo mejor que puedes hacer es convertir ese número en un String, y extraer la cadena de la parte decimal:

Código :

Function MiRedondeo(numero As Double) As Boolean
    Dim strNum As String
    Dim commaPos As Long
    Dim redondeo As Boolean
    
    strNum = CStr(numero)

    'Dependiendo de la configuración regional del SO, los decimales se representan con punto o coma, así que comprobamos los 2:
    commaPos = InStr(strNum, ".")
    If commaPos = 0 Then
        commaPos = InStr(strNum, ",")
    End If
    
    If commaPos > 0 Then
        If Mid(strNum, commaPos + 1) = "3" Then redondeo = True
    End If
    
    MiRedondeo = redondeo
End Function

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.