Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth
Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

42,641 questions

55,376 answers

573 users

How to convert a decimal number to a rational number in JavaScript

1 Answer

0 votes
/*
    convertDecimalToRational(s)
    ---------------------------
    Converts a decimal number (given as a string) into an exact rational p/q.

    Why parse the string manually?
        • JavaScript has no built‑in rational type.
        • Number (IEEE‑754 float) cannot preserve exact decimal digits.
        • Using strings + BigInt ensures perfect accuracy.

    Algorithm:
        1. Look for a decimal point.
        2. If none → integer → numerator = n, denominator = 1.
        3. Otherwise:
              Example: "12.345"
              integer part   = 12
              fractional part = 345
              digits = 3

              numerator   = integer_part * 10^digits + fractional_part
              denominator = 10^digits

        4. Reduce using gcd (Euclid’s algorithm).
*/

function gcd(a, b) {
    // Euclid's algorithm using BigInt
    while (b !== 0n) {
        const t = b;
        b = a % b;
        a = t;
    }
    return a < 0n ? -a : a; // ensure positive gcd
}

function convertDecimalToRational(s) {
    const dotPos = s.indexOf(".");

    if (dotPos === -1) {
        // No decimal point → integer
        return {
            numerator: BigInt(s),
            denominator: 1n
        };
    }

    // Split into integer and fractional parts
    const intPart = s.slice(0, dotPos);
    const fracPart = s.slice(dotPos + 1);

    const integerValue = BigInt(intPart);
    const fractionalValue = BigInt(fracPart);

    const digits = fracPart.length;

    // Build denominator = 10^digits
    const denominator = 10n ** BigInt(digits);

    // Build numerator
    const numerator = integerValue * denominator + fractionalValue;

    // Reduce using gcd
    const g = gcd(numerator, denominator);

    return {
        numerator: numerator / g,
        denominator: denominator / g
    };
}

/*
    Main
*/

const values = [
    "3.5", "12.75", "0.125", "100.001",
    "7", "42.0", "0.333", "5.2"
];

for (const v of values) {
    const r = convertDecimalToRational(v);
    console.log(`${v} -> ${r.numerator}/${r.denominator}`);
}



/*
run:

3.5 -> 7/2
12.75 -> 51/4
0.125 -> 1/8
100.001 -> 100001/1000
7 -> 7/1
42.0 -> 42/1
0.333 -> 333/1000
5.2 -> 26/5

*/

 



answered Jul 23 by avibootz
...