[JavaScript] 実数を分数のまま計算するクラス

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[JavaScript] 実数を分数のまま計算するクラス

前回の記事と同じ目的で、値を分数のまま計算するクラスを作った。

細かいエラー処理などはしていないのでどうなるかはわからないが、何らかの計算を伴う処理の後には必ず約分関数を呼ぶようにし、約分関数でエラーをチェックするような設計にした。

動作サンプル

var f = new Fraction(6, 4);
console.log(f);    // 3 / 2 num=3 den=2

f.add(new Fraction(2, 3.2));
console.log(f);    // 17 / 8 num=17 den=8

f['*'](new Fraction(5, 2));
console.log(f);    // 85 / 16 num=85 den=16

ソースコード

var Fraction = function(num, den) {
    var isFraction = num instanceof arguments.callee;
    this.num = Number(isFraction ? num.num : num || 0);
    this.den = Number(isFraction ? num.den : den || 1);
    this.reduce();
};

Fraction.prototype.valueOf = function() { return this.num / this.den; };
Fraction.prototype.toString = function() { return this.num + ' / ' + this.den; };

/** 約分 */
Fraction.prototype.reduce = function() {
    var num = Math.abs(this.num), den = Math.abs(this.den);
    if (!isFinite(num) || !isFinite(den) || den === 0) throw 'Error';    //XXX
    if (num) {
        var sign = this.num / num * this.den / den;
        while ((num % 1) || (den % 1)) { num *= 10; den *= 10; }  //整数化
        var r, m = Math.max(num, den), n = Math.min(num, den);    //互除法
        while (r = m % n) { m = n; n = r; }
        this.num = sign * num / n;
        this.den = den / n;
    } else {
        this.num = 0;
        this.den = 1;
    }
};

/** 加算 */
Fraction.prototype['+'] = Fraction.prototype.add = function(n) {
    n = new Fraction(n);

    this.num = this.num * n.den + n.num * this.den;
    this.den *= n.den;

    this.reduce();
};

/** 減算 */
Fraction.prototype['-'] = Fraction.prototype.subtract = function(n) {
    n = new Fraction(n);

    this.num = this.num * n.den - n.num * this.den;
    this.den *= n.den;

    this.reduce();
};

/** 乗算 */
Fraction.prototype['*'] = Fraction.prototype.multiply = function(n) {
    n = new Fraction(n);

    this.num *= n.num;
    this.den *= n.den;

    this.reduce();
};

/** 除算 */
Fraction.prototype['/'] = Fraction.prototype.divide = function(n) {
    n = new Fraction(n);

    this.num *= n.den;
    this.den *= n.num;

    this.reduce();
};

メモ

var Fraction = function(num, den) {
    var isFraction = num instanceof arguments.callee;
    this.num = Number(isFraction ? num.num : num || 0);
    this.den = Number(isFraction ? num.den : den || 1);
    this.reduce();
};

↑引数は次の4パターン。

  1. 引数なし :: 0 / 1として初期化
  2. Fraction :: 分数をコピーして新しいクラスを作る
  3. number :: number / 1として初期化
  4. number, number :: number / numberとして初期化
スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/90-391d877b

トラックバック

[JavaScript] 分数で計算する中置記法電卓
前回の記事と前々回の記事で書いていた数式パーサと分数クラスを改良して、中置記法の数式を分数のまま計算する電卓を書いた。 最終的には、...
  • 2008-03-09
  • 発信元: 文系大学的IT系の悲哀

コメント

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。