有没有一个JavaScript函数可以减少分数

问题描述 投票:0回答:9

假设我们有分数

2/4
,它可以化简为
1/2

有没有一个 JavaScript 函数可以做到减少?

javascript function fractions
9个回答
103
投票
// 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]

10
投票

不,但你可以很容易地自己写一个。 本质上,您需要将分数的顶部和底部部分除以它们的“最大公分母”...您可以根据欧几里得算法进行计算。

阅读此处了解更多信息: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));

7
投票

我知道这是一篇旧文章,但我将接受的答案转换为循环解决方案而不是递归函数。这将提高内存效率并且可能更快(不需要内存堆栈操作和执行调用)。

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];
}

内存占用仅为 5 个数字结构和一个简单的循环。


5
投票

要减少分数,请将分子和分母除以最大公因数。 Phrogz 和 David 已经提供了源代码..

但是,如果您正在寻找用于处理分数的 javascript 库,那么这里有一些可供选择。

  1. 分数.js
  2. 数学.理性
  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
投票

我知道已经有答案了,但我想分享一个 JS 库,是我在寻找一些东西时发现的 将十进制数转换为分数减少分数

图书馆调用了Fraction.js,这对我来说真的很有帮助,节省了我很多时间和工作。 希望它对其他人非常有用!


0
投票

这是一个使用 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减少或更多信息。


0
投票

减少“2/4”等字符串分数并输出为字符串分数。

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


0
投票

除了Jan之外,我会将他的职能更改为:

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};              }

当分子 >= 分母时,这也将返回舍入数。


0
投票
function gcd(a,b,...c){
    var f=b?gcd(b,a%b):a;
    return c.length? gcd(f,...c):f;
}
function ratio(...x){
    var f=gcd(...x);
    return x.map(n=>n/f);
}

ratio(15,20,25); // [3,4,5]
© www.soinside.com 2019 - 2024. All rights reserved.