是否有一个减少分数的javascript函数

dav*_*ave 39 javascript function fractions

说我们有2/4分数,它可以减少到1/2.有没有可以减少的javascript函数?

Phr*_*ogz 75

// 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]
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常优雅的`gcd`功能.我建议的唯一变化是某种形式的输入检查`NaN`为`gcd(NaN,1)`产生`1`我想要'NaN`或错误. (2认同)
  • @zzzzBov一个有趣的边缘案例.当然可以添加`if(isNaN(分子)|| isNaN(分母))返回NaN;`作为第一行. (2认同)
  • 有趣的是,这个解决方案使用Euclid的算法来查找GCD:https://en.wikipedia.org/wiki/Euclidean_algorithm (2认同)
  • 效果很好,但为什么要指定函数名称“gcd”两次,然后将数值结果分配给同一个变量?这是糟糕的 JavaScript 礼仪。 (2认同)

dav*_*vid 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));
Run Code Online (Sandbox Code Playgroud)


fla*_*000 6

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

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];
}
Run Code Online (Sandbox Code Playgroud)

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


Lar*_*tle 5

要减少分数,请将分子和分母除以最大公因数.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.
Run Code Online (Sandbox Code Playgroud)