在Javascript中将十进制数转换为文本字符串分数?

时间:2011-08-30 20:12:05

标签: javascript fractions

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

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

答案 0 :(得分: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
}

答案 1 :(得分:2)

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";

答案 2 :(得分:1)

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

如果您的范围相等,这可能很简单,但由于您有一些1/10(0.3到0.4)和一些2/10(0.5到0.7),它会稍微复杂一点,而不仅仅是乘以10。 / p>


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));

答案 3 :(得分:0)

  1. 多个amt乘以10并获取整数部分
  2. 从您之前构建的数组中 - 查找相应的字符串!
  3. NB - 该数组是固定的 - 静态