none
Convertir decimales a Fracción RRS feed

  • Pregunta


  • Saludos amigos de la comunidad vb.net, mi consulta se basa en lo siguiente:

    tengo dos Textbox a los que divido y el resultado se lo asigno a un tercer Texbox, el problema radica en que me da el resultado en decimales, que metodo me serviria para convertir el valor del tercer Texbox a fracción.

    Ademas que metodo o función seria la respectiva para una vez dado el resultado en fracción, poder simplificar el mismo.

    Muchas Gracias, Bendiciones.

    miércoles, 14 de octubre de 2015 23:11

Respuestas

  • ' 3 textboxes y un botón
    ' en un textbox escribes el numerador de la fracción
    ' en otro el denominador
    ' das clic en el botón
    ' el resultado se coloca en el tercero
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim num = Integer.Parse(numerador.Text)
                Dim den = Integer.Parse(denominador.Text)
                Dim mcd = MaxComDiv(num, den)
    
                fraccion.Text = (num / mcd).ToString & If(den / mcd > 1, " / " & (den / mcd).ToString, "")
    
            Catch ex As Exception
    
            End Try
        End Sub
    
        Private Function MaxComDiv(p1 As Integer, p2 As Integer) As Integer
            Dim div1() As Integer = Divisores(p1).ToArray()
            Dim div2() As Integer = Divisores(p2).ToArray()
    
            Dim query = div1.Intersect(div2).OrderByDescending(Function(k) k)
    
            If query.Count > 0 Then
                Return query.First
            Else
                Return 1
            End If
        End Function
    
        Private Function Divisores(p1 As Integer) As List(Of Integer)
    
            Dim lista As New List(Of Integer)
    
            For k = 1 To p1
                If p1 Mod k = 0 Then
                    lista.Add(k)
                End If
            Next
    
            Return lista
        End Function
    
    End Class
    

    jueves, 15 de octubre de 2015 13:09

Todas las respuestas

  • Para convertir un número en fracción, simplemente multiplica el número por un 1 seguido de tantos ceros como decimales tenga tu número, y divídelo por el mismo número. Por ejemplo, si tienes 12,3456, entonces te fijas en que tiene 4 decimales y por lo tanto multiplicas por 10000. La fracción equivalente es por tanto 123456/10000.

    Para simplificarla, construye primero una lista de números primos (encontrarás en la red docenas de ejemplos de cómo hacer esto), y comienza por el más pequeño (el 2) dividiendo numerador y denominador por 2 hasta que ya no se pueda dividir más dando un resultado entero. Después repite con el 3, el 5, el 7, y así sucesivamente hasta que ya no se pueda simplificar más.

    jueves, 15 de octubre de 2015 5:52
  • Hola:

    Una posible solución (si ya usas o no te importa añadir una referencia a Excel en tu proyecto), puede ser algo parecido a esto:

    Imports Microsoft.Office.Interop.Excel
    
    Dim xlsx As New Excel.Application
    
    xlsx.WorksheetFunction.Text(5.55, "# ??/8") ' => 5 4/8
    xlsx.WorksheetFunction.Text(5.55, "# ??/16") ' => 5 9/16
    xlsx.WorksheetFunction.Text(5.55, "# ??/32") ' => 5 18/32
    xlsx.WorksheetFunction.Text(5.55, "# ??/100") ' => 5 55/100

    Un saludo


    • Editado LG DES jueves, 15 de octubre de 2015 7:57
    jueves, 15 de octubre de 2015 7:56
  • ' 3 textboxes y un botón
    ' en un textbox escribes el numerador de la fracción
    ' en otro el denominador
    ' das clic en el botón
    ' el resultado se coloca en el tercero
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim num = Integer.Parse(numerador.Text)
                Dim den = Integer.Parse(denominador.Text)
                Dim mcd = MaxComDiv(num, den)
    
                fraccion.Text = (num / mcd).ToString & If(den / mcd > 1, " / " & (den / mcd).ToString, "")
    
            Catch ex As Exception
    
            End Try
        End Sub
    
        Private Function MaxComDiv(p1 As Integer, p2 As Integer) As Integer
            Dim div1() As Integer = Divisores(p1).ToArray()
            Dim div2() As Integer = Divisores(p2).ToArray()
    
            Dim query = div1.Intersect(div2).OrderByDescending(Function(k) k)
    
            If query.Count > 0 Then
                Return query.First
            Else
                Return 1
            End If
        End Function
    
        Private Function Divisores(p1 As Integer) As List(Of Integer)
    
            Dim lista As New List(Of Integer)
    
            For k = 1 To p1
                If p1 Mod k = 0 Then
                    lista.Add(k)
                End If
            Next
    
            Return lista
        End Function
    
    End Class
    

    jueves, 15 de octubre de 2015 13:09
  • Muchas gracias LG DES, Un saludo.
    jueves, 15 de octubre de 2015 19:54
  •  Muchas Gracias Alberto Poblaciòn, Un Saludo.
    jueves, 15 de octubre de 2015 19:55
  • ' 3 textboxes y un botón
    ' en un textbox escribes el numerador de la fracción
    ' en otro el denominador
    ' das clic en el botón
    ' el resultado se coloca en el tercero
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim num = Integer.Parse(numerador.Text)
                Dim den = Integer.Parse(denominador.Text)
                Dim mcd = MaxComDiv(num, den)
    
                fraccion.Text = (num / mcd).ToString & If(den / mcd > 1, " / " & (den / mcd).ToString, "")
    
            Catch ex As Exception
    
            End Try
        End Sub
    
        Private Function MaxComDiv(p1 As Integer, p2 As Integer) As Integer
            Dim div1() As Integer = Divisores(p1).ToArray()
            Dim div2() As Integer = Divisores(p2).ToArray()
    
            Dim query = div1.Intersect(div2).OrderByDescending(Function(k) k)
    
            If query.Count > 0 Then
                Return query.First
            Else
                Return 1
            End If
        End Function
    
        Private Function Divisores(p1 As Integer) As List(Of Integer)
    
            Dim lista As New List(Of Integer)
    
            For k = 1 To p1
                If p1 Mod k = 0 Then
                    lista.Add(k)
                End If
            Next
    
            Return lista
        End Function
    
    End Class

     Muchas Gracias AlterEgo22, tu respuesta ta me ha servido en parte, pero cuando realizo la sigueinte divisiòn  -1/-7, me da como resultado: -1, y en cambio cuando lo hago en  mi calculadora me da como resultado: 1/7.

    Otra consulta AlterEgo22, que pasa si quiero dividir en los textbox respectivos, dos fracciones, o un numero entero con una fracciòn, por ejemplo:  7/5  /  4/6 y el resultado lo va a capturar de igual manera el fraccion.text.

    o el siguiente esceneario, 8 / 15/6.

    Muchas gracias por tu ayuda me a sido util, te dejo mis dudas, Un Saludo.

    sábado, 17 de octubre de 2015 18:11
  • Fue una respuesta simple a un problema simple, dos textboxes donde ingresar sendos valores enteros, y la respuesta en forma de fracción simplificada mostrada en un tercer textbox.

    Cuando agregas las complejidades que mencionas en tu último post, entonces ya no caben respuestas sencillas que ocupen 10 líneas. Fijate, por ejemplo, que en tu pregunta inicial, vos ingresabas un único token en cada textbox. Eso nos facilita todo. Ahora, si vos en un textbox ingresás tres tokens al mismo tiempo, "7/5", ya deja de ser un ejercicio para principiantes.

    Pienso yo, bah! 

    sábado, 17 de octubre de 2015 21:11
  • Esta respuesta es en VBA de Excel:

    Public Function Decimal_a_fraccion(ByVal dec As Single) As String
    'Función que convierte decimal a fracción
    'Publicado por Ruri el 04/09/2004 y adaptado por Zamej el 2017-11-01.
        Dim s As String, fract As String, iPos As Long, lngFract As Long
        Dim inte As Long, Denominador As Long, Numerador As Long
        Dim MaxComDiv As Long, Fracc_nume As Long, Fracc_deno As Long
        s = CStr(dec)
        iPos = InStr(1, s, ".", vbTextCompare)
        If iPos < 1 Then Exit Function
        fract = Mid$(s, iPos + 1)
        lngFract = CLng(Val(fract))
        inte = CLng(Int(Val(s)))
        Denominador = 10 ^ Len(fract)
        Numerador = (inte * Denominador) + fract
        's = Numerador & "/" & Denominador  'Ej:4.78 = 478/100
        MaxComDiv = Excel.WorksheetFunction.Gcd(Numerador, Denominador)
        Fracc_nume = Numerador / MaxComDiv
        Fracc_deno = Denominador / MaxComDiv
        s = Fracc_nume & "/" & Fracc_deno 'Ej:4.78 = 239/50
        Decimal_a_fraccion = s
    End Function

    jueves, 2 de noviembre de 2017 6:48