Technical Article

Format decimal value to fraction using a tally table.

,

This function takes a decimal value and returns fractional representation of this value.

SELECT dbo.DecimalToFraction(12.5) 

Result: 12 1/2

The interesting thing about this code is that it uses a tally table to find the smallest denominator for the decimal part.

-- Raw Code

DECLARE @Value AS DECIMAL(10,3)
SET @Value = 10.375


SELECT Fraction = CONVERT(VARCHAR,p.IntegerPart)+
      CASE WHEN f.Denominator IS NOT NULL 
   THEN ' '+CONVERT(VARCHAR,Numerator)+'/'+CONVERT(VARCHAR,Denominator) 
   ELSE ''
   END
FROM (SELECT IntegerPart =FLOOR(@Value) , DecimalPart = @Value - FLOOR(@Value) ) p
OUTER APPLY(SELECT TOP 1
   Denominator = Number, 
   Numerator = CONVERT(INT, DecimalPart  / (1.0/Number) )
FROM Numbers  
WHERE DecimalPart > 0 AND
  Number BETWEEN 2 AND 200 AND 
  DecimalPart  % (1.0 / Number) = 0.0
ORDER BY Denominator ASC
   ) f 


GO


--  Wrapped in a function
CREATE FUNCTION dbo.DecimalToFraction( @Value AS DECIMAL(30,10) )
RETURNS VARCHAR(50)
AS
BEGIN

DECLARE @FractionNumber AS VARCHAR(50)

SELECT @FractionNumber = CONVERT(VARCHAR,p.IntegerPart)+
 CASE WHEN f.Denominator IS NOT NULL 
  THEN ' '+CONVERT(VARCHAR,Numerator)+'/'+CONVERT(VARCHAR,Denominator) 
  ELSE ''
 END
FROM (SELECT IntegerPart =FLOOR(@Value) , DecimalPart = @Value - FLOOR(@Value) ) p
OUTER APPLY(SELECT TOP 1
   Denominator = Number, 
   Numerator = CONVERT(INT, DecimalPart  / (1.0/Number) )
FROM Numbers  
WHERE DecimalPart > 0 AND
  Number BETWEEN 2 AND 200 AND 
  DecimalPart  % (1.0 / Number) = 0.0
ORDER BY Denominator ASC
   ) f 

RETURN @FractionNumber
END

Rate

1.67 (3)

You rated this post out of 5. Change rating

Share

Share

Rate

1.67 (3)

You rated this post out of 5. Change rating