Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Function dec2frac(dblDecimal As Double) As String
'
' Excel function to convert decimal values to integer fractions.
'
' Written by: Erik Oosterwal
' Started on: November 16, 2006
' Completed on: November 16, 2006
'
Dim intNumerator, intDenominator, intNegative As Long ' Declare integer variables as long
' integers.
Dim dblFraction, dblAccuracy As Double ' Declare floating point variables
' as double precision.
Dim txtDecimal As String ' need a string representation of the input value
Dim i As Integer ' in order to determine the required accuracy.
' Find the accuracy needed for the output by checking the number of digits behind the decimal point
' of the input value.
'
' dblAccuracy = 1 / 10 ^ (Len(CStr(dblDecimal - Fix(dblDecimal))) - 2)
'
' While the formula above should work, there is a serious error in the way Excel handles
' decimal numbers and there's a huge rounding error issue. Subtracting the int() of
' 12.1 from 12.1 produces 0.0999999999 or something similar. Obviously that won't
' work for our desired accuracy of the magnitude of the fractional part of the number
' so a slower more cumbersome method has to be used...
dblAccuracy = 0.1 ' Set the initial Accuracy level.
txtDecimal = CStr(dblDecimal) ' Get a string representation of the input number.
For i = 1 To Len(txtDecimal) ' Check each character to see if it's a decimal point...
If Mid$(txtDecimal, i, 1) = "." Then ' if it is then we get the number of digits behind the decimal
dblAccuracy = 1 / 10 ^ (Len(txtDecimal) - i + 1) ' assign the new accuracy level, and
Exit For ' exit the for loop.
End If
Next
intNumerator = 0 ' Set the initial numerator value to 0.
intDenominator = 1 ' Set the initial denominator value to 1.
intNegative = 1 ' Set the negative value flag to positive.
If dblDecimal < 0 Then intNegative = -1 ' If the desired decimal value is negative,
' then set the negative value flag to
' negative.
dblFraction = 0 ' Set the fraction value to be 0/1.
While Abs(dblFraction - dblDecimal) > dblAccuracy ' As long as we're still outside the
' desired accuracy, then...
If Abs(dblFraction) > Abs(dblDecimal) Then ' If our fraction is too big,
intDenominator = intDenominator + 1 ' increase the denominator
Else ' Otherwise
intNumerator = intNumerator + intNegative ' increase the numerator.
End If
dblFraction = intNumerator / intDenominator ' Set the new value of the fraction.
Wend
dec2frac = LTrim(Str(intNumerator)) & "/" & LTrim(Str(intDenominator)) ' Display the numerator and denominator
End Function
Public Function properDec2Frac(dblVal As Double) As String
Dim intPart As Long
Dim decPart As Double
intPart = Fix(dblVal)
decPart = dblVal - intPart
If intPart = 0 And decPart = 0 Then
properDec2Frac = "0"
ElseIf intPart = 0 Then
properDec2Frac = dec2frac(decPart)
Else
properDec2Frac = intPart & " " & dec2frac(Abs(decPart))
End If
End Function