Есть ли функция JavaScript, которая уменьшает долю - PullRequest
36 голосов
/ 11 января 2011

скажем, у нас есть фракция 2/4, ее можно уменьшить до 1/2. Есть ли функция JavaScript, которая может сделать сокращение?

Ответы [ 5 ]

69 голосов
/ 11 января 2011
// 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]
9 голосов
/ 11 января 2011

Нет, но вы можете написать самостоятельно довольно легко. По сути, вам нужно разделить верхнюю и нижнюю части дроби по их «величайшему общему знаменателю» ... который вы можете рассчитать по алгоритму Евклида.

Подробнее читайте здесь: http://www.jimloy.com/number/euclids.htm

редактирование:

код (потому что все, кажется, делают это, хотя и не используют рекурсию)

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));
5 голосов
/ 14 июня 2012

Чтобы уменьшить дробь, разделите числитель и знаменатель на Величайший общий фактор.Phrogz и David уже предоставили исходный код ..

Однако, если вы ищете библиотеки javascript для обработки дробей, то вот несколько вариантов на выбор.

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

Вот пример использования 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.
1 голос
/ 21 октября 2014

Я знаю, что ответ уже есть, но я хочу поделиться библиотекой JS, которую я нашел, когда искал что-то, чтобы преобразовывать десятичные числа в дроби и , сокращая дроби .

Библиотека вызывает Fraction.js , что было очень полезно для меня и сэкономило мне много времени и работы.Надеюсь, что это может быть очень полезно для кого-то еще!

0 голосов
/ 25 сентября 2016

Вот рекурсивная функция, использующая ECMAScript 6 Reduce. Это работает для большинства фракций, пока остаток не слишком мал. Значение 0 было переопределено, чтобы оно работало для таких массивов, как [1.2, 2.4, 12, 24]. Я тестировал в Chrome и IE Edge, поэтому он может вести себя по-другому в других браузерах или обновлениях. Так что он должен работать с массивом с плавающей точкой.

 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();

Поиск MDN уменьшить или больше информации здесь .

...