Skip to main content

New Page

I use this function to create fractions, it supports a "Precision" that defaults to 32 so you can use 16, 32, 64, etc... if you want. 
You use it the same way as MV Fractions. 

Examples:

With 32nd being default Fraction(45.89763) =  45-29/32

If i set the 2nd param to a 16th then Fraction((45.89763, 16) = 45-7/8

Public Function Fraction(ByVal DecimalNumber As Object, _

    Optional ByVal Precision As Long = 32, _
    Optional ShowDash As Boolean = True, _
    Optional RoundDown As Boolean = False) As String


    Dim GCD, TopNumber, Remainder, WholeNumber, Numerator, Denominator As Integer
   
    If IsNumeric(DecimalNumber) Then
        If RoundDown Then
            DecimalNumber = Math.Floor(CDBL(DecimalNumber) * Precision) / Precision
        Else
            DecimalNumber = CDBL(DecimalNumber)
        End If
       
        WholeNumber = Fix(DecimalNumber)
        Denominator = Precision
        Numerator = Denominator * Math.Abs(DecimalNumber - WholeNumber)


        If (Numerator <> Denominator) And (Numerator > 0) Then
            GCD = Precision
            TopNumber = Numerator
            Do
                Remainder = (GCD Mod TopNumber)
                GCD = TopNumber
                TopNumber = Remainder
            Loop Until Remainder = 0
            Numerator = Numerator \ GCD
            Denominator = Denominator \ GCD


            ' Create and return the fraction
            Fraction = If(DecimalNumber < 0 And WholeNumber = 0, "-", "") & _
                        If(WholeNumber <> 0, CStr(WholeNumber), "") & _
                        If(ShowDash And WholeNumber <> 0, "-", If(WholeNumber <> 0, " ", "")) & _
                        CStr(Numerator) & "/" & CStr(Denominator) & """"
        Else
            If Numerator = Precision Then WholeNumber += 1
            Fraction = CStr(WholeNumber) & """"
        End If
    Else
        Return ""
    End If
End Function