Is there a JavaScript function that reduces a fraction

JavascriptFunctionFractions

Javascript Problem Overview


say we have fraction 2/4, it can be reduced to 1/2.

Is there a JavaScript function that can do the reducing?

Javascript Solutions


Solution 1 - Javascript

// Reduce a fraction by finding the Greatest Common Divisor and dividing by it.
function reduce(numerator,denominator){
  var gcd = function gcd(a,b){
    return b ? gcd(b, a%b) : a;
  };
  gcd = gcd(numerator,denominator);
  return [numerator/gcd, denominator/gcd];
}

reduce(2,4);
// [1,2]

reduce(13427,3413358);
// [463,117702]

Solution 2 - Javascript

No, but you can write one yourself fairly easily. Essentially you need to divide the top and bottom parts of the fraction by their 'Greatest Common Denominator'... Which you can calculate from Euclid's algorithm.

Read here for more info: http://www.jimloy.com/number/euclids.htm

edit:

code (because everyone seems to be doing it, this doesn't use recursion though)

var FractionReduce = (function(){
    //Euclid's Algorithm
    var getGCD = function(n, d){
        var numerator = (n<d)?n:d;
        var denominator = (n<d)?d:n;        
        var remainder = numerator;
        var lastRemainder = numerator;

        while (true){
            lastRemainder = remainder;
            remainder = denominator % numerator;
            if (remainder === 0){
                break;
            }
            denominator = numerator;
            numerator = remainder;
        }
        if(lastRemainder){
            return lastRemainder;
        }
    };

    var reduce = function(n, d){
        var gcd = getGCD(n, d);

        return [n/gcd, d/gcd];
    };

    return {
            getGCD:getGCD,
            reduce:reduce
           };

}());

alert(FractionReduce.reduce(3413358, 13427));

Solution 3 - Javascript

To reduce a fraction, divide the numerator and denominator by the Greatest Common Factor. Phrogz and David have already provided the source code..

However if you're searching for javascript libraries for handling fractions, then here are a few to choose from.

  1. Fraction.js
  2. Math.Rational
  3. Ratio.js
  4. Rational.js

Here's an example using Ratio.js.

var a = Ratio(2,4);

a.toString() == "2/4";
a.simplify().toString() == "1/2";	 // reduce() returns a clone of the Ratio()
a.toString() == "2/4"; // Ratio functions are non-destructive.

Solution 4 - Javascript

I know this is an old post, but I converted the accepted answer into a loop solution instead of a recursive function. This would be much more memory efficient and likely much faster (no memory stack operations and execution calls needed).

function reduce(numerator, denominator) {
	var a = numerator;
	var b = denominator;
	var c;
	while (b) {
		c = a % b; a = b; b = c;
	}
	return [numerator / a, denominator / a];
}

The memory footprint is just 5 Number structs, and a simple loop.

Solution 5 - Javascript

I know there is already an answer, but I want share a JS library that I found when I was looking something to convert decimal numbers into fractions and reducing fractions.

The library calls Fraction.js, which was really helpful for me and saved me a lot time and work. Hope it can be very useful to somebody else!

Solution 6 - Javascript

Here is a recursive function using ECMAScript 6 reduce. It works for most fractions as long as the remainder isn't too small. 0 has been redefined to make it work for arrays like [1.2, 2.4, 12, 24]. I tested in Chrome and IE Edge so it may behave differently in other browsers or upgrades. So it should work with an array of floats.

 Array.prototype.gcd = function () {
   if (this.length === 0)
     return null;
   return this.reduce((prev, curr) => {
     if (curr <= 1.00000000001e-12)
       return prev
     else
       return [curr, prev % curr].gcd();
    });
  }

  var reducedValueGCD = [1.2, 2.4, 12, 24, 240].gcd();

Search for MDN reduce or more info here.

Solution 7 - Javascript

> Reduce a string fraction like "2/4" and output as string fraction.

function reduce([numerator, denominator]){
  for (let i = numerator; i > 0; i--) {
    if(!(numerator % i) && !(denominator % i)){
      return [(numerator / i), (denominator / i)];
    }
  }
}

function reduceFraction(string){
  return reduce(string.split('/').map(n => +n)).join('/');
}

one = '2/4';
two = '20/200';
three = '330/2050';

console.log('2/4 reduced to', reduceFraction(one));
console.log('20/200 reduced to', reduceFraction(two));
console.log('330/2050 reduced to', reduceFraction(three));

Solution 8 - Javascript

In addition to Jan I would change his function to:

function reduce(numerator,denominator){
var roundNr = 0

if(numerator >= denominator) {
	roundNr = Math.floor(numerator / denominator);
	numerator -= (roundNr * denominator);
}

var gcd = function gcd(a,b){
		return b ? gcd(b, a%b) : a;
};
gcd = gcd(numerator,denominator);
return {roundNr: roundNr, numerator: numerator/gcd, denominator: 		denominator/gcd};              }

This will also return the roundnumber when the numerator >= denominator.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondaveView Question on Stackoverflow
Solution 1 - JavascriptPhrogzView Answer on Stackoverflow
Solution 2 - JavascriptdavidView Answer on Stackoverflow
Solution 3 - JavascriptLarry BattleView Answer on Stackoverflow
Solution 4 - Javascriptflamewave000View Answer on Stackoverflow
Solution 5 - JavascriptJabel MárquezView Answer on Stackoverflow
Solution 6 - JavascriptRetroCoderView Answer on Stackoverflow
Solution 7 - JavascriptSoEzPzView Answer on Stackoverflow
Solution 8 - JavascriptAndries van WeerenView Answer on Stackoverflow