5

数値として返される値があります。たとえば、「1.15」などの 10 進数である可能性があります。

ただし、範囲内のすべての数値を特定の分数にフォーマットする必要があります。たとえば、0 より大きく .2 より小さいすべての数値は「1/8」を返したいとします。

私はすでにこれを一連の if/else ステートメントとして実行し始めましたが、もっとスマートできちんとした方法があるかどうか疑問に思っていました。

if (amt > 0 && amt <= .2){
    q = '1/8';
} else if (amt > .2 && amt <= .3){
    q = '1/4';
}  else if (amt > .3 && amt <= .4){
    q = '1/3';
}  else if (amt > .4 && amt <= .5){
    q = '1/2';
} else if (amt > .5 && amt <= .7){
    q = '2/3';
} else if (amt > .7 && amt <= .8){
    q = '3/4';
} else if (amt > .8 && amt <= 1.0){
    q = '7/8';
} else if (amt > 1 && amt <= 1.1){
    q = '1';
} etc.....
4

4 に答える 4

3

Ratio.jsには という関数があります.toQuantityOf()

.toQuantityOf()指定された単位に基づいて分数の現在の値を近似値に変換した後、新しい分数を返します。複数のユニットが引数として渡された場合、元の値に最も近いものが返されます。

.toString()分数を文字列として返します。

var fraction = Ratio.parse("1.15").toQuantityOf(2,3,4,8);
fraction.toString() == "9/8";

.toLocaleString()必要に応じて混合数を返します。

fraction.toLocaleString() == "1 1/8";
于 2012-05-09T00:12:53.293 に答える
3

コードを関数に移動するとreturn、正しいブランチからすべてのelseステートメントをスキップできるため、かなり劇的にクリーンアップされます。

function toFraction(amt) {
  if (amt > 0 && amt <= .2) return '1/8';
  if (amt <= .3) return '1/4';
  if (amt <= .4) return '1/3';
  if (amt <= .5) return '1/2';
  // etc
}
于 2011-08-30T20:19:44.283 に答える
1

数値演算を実行しamtて範囲内の整数値に変換し、それを配列ルックアップのインデックスとして使用して分数テキストを取得できます。

範囲が等しい場合は簡単ですが、10 分の 1 (0.3 から 0.4) と 10 分の 2 (0.5 から 0.7) があるため、10 を掛けるだけではなく、もう少し複雑です。


fractional = {
    fractions: [ "1/8", "1/8", "1/4", "1/3", "1/2", "2/3", "2/3", "3/4", "7/8", "1" ],
    toFraction: function(amt) {
        return this.fractions[(""+(amt*10)).split('.')[0]];
    }
};

alert(fractional.toFraction(0.37));
于 2011-08-30T20:26:47.087 に答える