5

我有一个作为数字返回的值,可以是十进制数,例如“1.15”。

但是,我需要将范围内的所有数字格式化为给定的分数。例如,所有大于 0 但小于 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

将你的代码移动到一个函数中,你可以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 回答
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 回答
1

您可以执行数学运算amt以将其转换为范围内的整数值,然后将其用作数组查找的索引以获取分数文本。

如果您的范围相等,这可能很简单,但是由于您有一些 1/10(0.3 到 0.4)和一些 2/10(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 回答
0
  1. 乘以amt10 并获得整数部分
  2. 从您之前构建的数组中查找相应的字符串!

注意 - 该数组是固定的 - 所以是静态的

于 2011-08-30T20:21:19.827 回答