2011-01-10 2 views

답변

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

매우 우아한'gcd' 함수입니다. 내가 제안 할 유일한 변화는'NaN'에 대한 입력 검사의 형태로서'gcd (NaN, 1)'이'NaN'이나 에러를 예상 할 때'1'을 생성한다는 것입니다. – zzzzBov

+2

@zzzzBov 흥미로운 엣지 케이스. 물론 if (isNaN (numerator) || isNaN (denominator))가 첫 번째 행으로 NaN;을 반환 할 수 있습니다. – Phrogz

+1

재미있는 사실,이 솔루션은 유클리드의 알고리즘을 사용하여 GCD를 찾습니다. https://en.wikipedia.org/wiki/Euclidean_algorithm – camou

7

아니요, 그렇지만 직접 작성하는 것은 간단합니다. 기본적으로 분수의 상단 부분과 하단 부분을 '가장 큰 공통 분모'로 나누어야합니다 ... 유클리드의 알고리즘으로 계산할 수 있습니다.

대한 추가 정보를 원하시면 여기를 읽어

: 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)); 
+0

분자를 처리하기 위해 +1> 분모 – Phrogz

5

으로 분수를 줄이고 분자와 분모를 가장 큰 공통 인자로 나눕니다. Phrogz와 David는 이미 소스 코드를 제공했습니다.

그러나 분수를 처리하는 자바 스크립트 라이브러리를 검색하는 경우 선택할 수있는 몇 가지 항목이 있습니다.

  • Rational.jsMath.Rational
  • Ratio.jsFraction.js
    1. 여기 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. 
      
  • +0

    감사합니다. 나는이 라이브러리의 상대적 효율성에 대해 묻는 질문을 게시했다 : http : // stackoverflow.com/questions/15840390/what-is-the-the-most-efficient-fraction-library-in-javascript? noredirect = 1 # comment22538987_15840390 – Omn

    +1

    @ 옥션 그래서 jsperf.com을 사용하여 이미 성능을 프로파일 링 했습니까? Ratio.js에 티켓을 열었을 때 문제가 발생하면이를 고치겠습니다. https://github.com/LarryBattle/Ratio.js –

    +0

    벤치 마크를 작성하고 실행 한 경험이 없습니다. 필자는 결국 코드에 들어가 코딩, 주석 및 구현 된 기능이 개선 된 것만 보았습니다. Ratio.js는 끝났지 만 그 이후로 그 프로젝트에 많은 시간을 할애 할 기회가 없었습니다. 문제를 발견하면 알려 드리겠습니다. 문제가 직접 보이면 버그 수정에 도움이 될 수 있습니다. – Omn

    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 검색 자세한 정보 here.

    관련 문제