• Viernes 29 de Marzo de 2024, 16:24

Autor Tema:  0.99 \ 1 = 1. WTF?  (Leído 2216 veces)

vemv91

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
0.99 \ 1 = 1. WTF?
« en: Domingo 4 de Abril de 2010, 19:39 »
0
Hola, este es mi primer post.

Vamos a ver... escribo un programita con un label y un botón. El botón contiene este código para el evento click:

Label1.Text = 0.99  1

Esta división *entera* me da como resultado en el label 1. Me parece que este operador redondea (!), porque esto no sucede con 0.4  1 por ejemplo. Hay algo que debería saber?

Gracias por adelantado  :beer:

Shiquilla

  • Miembro MUY activo
  • ***
  • Mensajes: 188
  • Nacionalidad: es
    • Ver Perfil
    • http://www.songesoft.com
Re: 0.99 \ 1 = 1. WTF?
« Respuesta #1 en: Lunes 19 de Abril de 2010, 17:36 »
0
Buenas tardes, eso es porque al dividir en vb la barra "" redondea al alza, es decir, si el resultado de la división es superior > 0.5 lo redondea al inmediato superior, si es inferior, al inmediato inferior, al final sólo devuelve un entero. Te paso el código de estas funciones que están implementadas en SQL Server pero en VB6 no. Te paso el código de ambas para que pongas la que quieras.

Código: Visual Basic
  1. 'Devuelve el entero más pequeño no menor que X.
  2. 'Ejemplo: Ceiling(1.23) = 2, Ceiling(-1.23) = -1
  3. Private Function Ceiling(ByVal X As Double) As Long
  4.    Ceiling = -Int(X * (-1))
  5. End Function
  6.  
  7. 'Devuelve el entero más grande no mayor que X.
  8. 'Ejemplo: Floor(1.23) = 1, Floor(-1.23) = -2
  9. Private Function Floor(ByVal X As Double) As Long
  10.    Floor = (-Int(X) * (-1))
  11. End Function
  12.  

Saludos,
« §hÿqµïllæ »

vemv91

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: 0.99 \ 1 = 1. WTF?
« Respuesta #2 en: Lunes 19 de Abril de 2010, 19:02 »
0
Qué tal chiquilla ;)

Bueno, probablemente el error es mío por esperar que un operador se comporte del modo que a mí me parece razonable.
Porque lo que quiero es ciertamente particular: una división "con resto" incluso entre dos números decimales, tipo 1.45 entre 0.105. Me temo que el código que has adjuntado sirve más bien para redondear...

El código que terminé escribiendo es éste.

Código: Text
  1.  
  2.         Dim Dividendo As Double
  3.         Dim Divisor As Double
  4.         Dim Operando As Double
  5.         Dim Contador As Integer
  6.         Dim Resto As Double
  7.         Dividendo = txtDividendo.Text
  8.         Divisor = txtDivisor.Text
  9.         If Divisor = 0 Then
  10.             Contador = 0
  11.             Resto = 0
  12.         ElseIf Divisor > Dividendo Then
  13.             Contador = 0
  14.             Resto = Dividendo
  15.         ElseIf Dividendo = Divisor Then
  16.             Contador = 1
  17.             Resto = 0
  18.         ElseIf Divisor + Divisor > Dividendo Then
  19.             Contador = 1
  20.             Resto = Dividendo - Divisor
  21.         Else
  22.             Operando = Divisor
  23.             Contador = 1
  24.             Do
  25.                 Operando += Divisor
  26.                 Contador += 1
  27.             Loop While Operando + Divisor <= Dividendo
  28.             Resto = Dividendo - Operando
  29.  
  30.         End If
  31.         lblResul.Text = "Cociente = " & Contador & ", resto = " & Resto
  32.  

Funciona bien por ejemplo con 8 entre 0.5 (16 exacto) pero entre 0.2 me da 0.1999999999996.
Le encontráis explicación a esto? Gracias y un saludo ;)