Подтвердить что ты не робот

Есть функция javascript, которая уменьшает долю

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

4b9b3361

Ответ 1

// 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]

Ответ 2

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

Читайте здесь для получения дополнительной информации: http://www.jimloy.com/number/euclids.htm

изменить:

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

var FractionReduce = (function(){
    //Euclid 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));

Ответ 3

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

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

Вот пример использования 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.

Ответ 4

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

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

Ответ 5

Вот рекурсивная функция, использующая ECMAScript 6. Он работает для большинства фракций, пока остаток не слишком мал. 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 или более подробная информация здесь.