我有一个以数字形式返回的值,可以是十进制数,例如“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.....
答案 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)
amt
乘以10并获取整数部分NB - 该数组是固定的 - 静态