Convert Ratio To Decimal

May 15, 2015

Our exercise today is an interview question. Like all of our interview questions, it works better if you put some pressure on yourself to simulate the pressure of an interview; so, for today’s exercise you must complete your solution in fifteen minutes:

Given two positive integers, a numerator and a denominator, and a third positive integer, the number of digits, write the decimal ratio of numerator to denominator to the requested number of digits. For instance, given a numerator of 3227, a denominator of 557, and a number of digits of 30, the correct output is 5.793536804308797127468581687612.

Your task is to write a program to convert ratios to decimals. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.

Advertisement

Pages: 1 2

5 Responses to “Convert Ratio To Decimal”

  1. Paul said

    In Python.

    from decimal import Decimal, getcontext
    
    def round_frac1(num, den, digits):
        getcontext().prec = digits
        return Decimal(num) / Decimal(den)
        
    def round_frac2(num, den, digits):
        res = ["" if num >= 0 else "-"]
        div, mod = divmod(abs(num), den)
        res += [str(div), "."]
        for d in range(digits):
            if mod == 0:
                break
            div, mod = divmod(mod * 10, den)
            res.append(str(div))
        return "".join(res)
    
    print(round_frac1(3227, 557, 31)) # 5.793536804308797127468581687612
    print(round_frac2(3227, 557, 30)) # 5.793536804308797127468581687612
    
  2. Globules said

    A quick ‘n dirty Haskell version.

    -- The result of a/b with n digits after the decimal point.
    divide n a b = let (q, r) = a `quotRem` b
                   in show q ++ "." ++ concatMap show (take n (r `fr` b))
      where a `fr` b = let (q, r) = (10*a) `quotRem` b in q : (r `fr` b)
    

    A couple of examples in ghci:

    λ> putStrLn $ divide 16 13 17
    0.7647058823529411
    λ> 13/17
    0.7647058823529411
    λ> putStrLn $ divide 30 3227 557
    5.793536804308797127468581687612
    λ> 
    
  3. Vaibhav Jain said

    In C++

    #include

    using namespace std;

    int main()
    {
    int den,num,dig,temp1,temp2;
    cout <> den;
    cout <> num;
    cout <> dig;
    cout << num/den << "."; // Whole number part of decimal followed by decimal point
    temp1=num;
    for (int i=0;i<30;i++)
    {
    temp2=(temp1%den)*10;
    cout << temp2/den;
    temp1=temp2%den;
    }
    return 0;
    }

  4. Christophe said

    Clojure
    I admit, it took me longer than 15 minutes..

    (defn long-division
      [nom denom decimals]
      (loop [result   (str (quot nom denom) ".")
             nom          (* (mod nom denom) 10)
             decimals                   decimals]
        (if (>  decimals 0 )
          (recur (str result (quot nom denom))
                 (* (mod nom denom) 10)
                 (dec decimals))
          result)))
    
    
    
    (println  (long-division 3227 557 30))
    

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: