将分数字符串转换为十进制?

rya*_*nve 23 javascript scope fractions

我正在尝试创建一个javascript函数,它可以采用分数输入字符串,例如'3/2'将其转换为十进制 - 或者作为字符串'1.5'或数字1.5

function ratio(fraction) {
    var fraction = (fraction !== undefined) ? fraction : '1/1',
    decimal = ??????????;
    return decimal;
});
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Aki*_*nos 42

由于还没有人提到它,因此有一个快速而肮脏的解决方案:

var decimal = eval(fraction); 
Run Code Online (Sandbox Code Playgroud)

这有利于正确评估各种数学字符串.

eval("3/2")    // 1.5
eval("6")      // 6
eval("6.5/.5") // 13, works with decimals (floats)
eval("12 + 3") // 15, you can add subtract and multiply too
Run Code Online (Sandbox Code Playgroud)

这里的人们会很快提到使用原始评估的危险,但我提交这个作为懒人的回答.

  • +1,因为它是一个简单的解决方案,你已经警告过危险. (3认同)
  • @GiH eval很慢,而且有潜在危险.如果用户可以找到一种让你在他的字符串上调用`eval()`的方法,那么他可以用它来做XSS. (3认同)
  • @Indolering 权利。他没有警告——这些——危险。但他确实提到存在相关危险。对于危险的列表,我们都可以问谷歌叔叔,或 bing 或其他任何 ;) (2认同)

Mat*_*eer 15

以下是执行此操作所需的最简单代码:

var a = "3/2";
var split = a.split('/');
var result = parseInt(split[0], 10) / parseInt(split[1], 10);
alert(result); // alerts 1.5
Run Code Online (Sandbox Code Playgroud)

JsFiddle:http://jsfiddle.net/XS4VE/

需要考虑的事项:

  • 被零除
  • 如果用户给你一个整数而不是分数,或任何其他无效输入
  • 舍入问题(例如1/3)

  • 不需要*parseInt*,只需使用`split [0]/split [1]`. (5认同)

Jak*_*one 9

我有一个函数用来处理整数、混合分数(包括 unicode 粗俗分数字符)和小数。可能需要一些改进,但它适合我的目的(食谱成分列表解析)。

\n\n\n\n

输入"2 1/2""2\xc2\xbd""2 \xc2\xbd"、 和"2.5"将全部返回2.5。例子:

\n\n
var numQty = require("numeric-quantity");\n\nnumQty("1 1/4") === 1.25;  // true\nnumQty("3 / 4") === 0.75;  // true\nnumQty("\xc2\xbc" ) === 0.25;     // true\nnumQty("2\xc2\xbd") === 2.5;      // true\nnumQty("\xc2\xbe") === 0.75;      // true\nnumQty("\xe2\x85\x93") === 0.333;     // true\nnumQty("\xe2\x85\x94") === 0.667;     // true\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不处理的一件事是分数内的小数,例如"2.5 / 5"

\n


Coo*_*mie 6

像这样的东西:

bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
Run Code Online (Sandbox Code Playgroud)


Fab*_*nça 6

为时已晚,但可能会有所帮助:

您可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceArray.prototype.reduce代替eval

ES6

const fractionStrToDecimal = str => str.split('/').reduce((p, c) => p / c);
console.log(fractionStrToDecimal('1/4/2')); // Logs 0.125
console.log(fractionStrToDecimal('3/2')); // Logs 1.5
Run Code Online (Sandbox Code Playgroud)

中山大学

function fractionStrToDecimal(str) {
  return str.split('/').reduce((p, c) => p / c);
}
console.log(fractionStrToDecimal('1/4')); // Logs 0.25
Run Code Online (Sandbox Code Playgroud)

[编辑] 删除了减速器初始值,现在该函数适用于大于 1 的分子。谢谢 James Furey。


小智 5

我创建了一个很好的函数来做到这一点,一切都是基于这个问题和答案,但它将采取字符串并输出十进制值,但也将输出整数也没有错误

https://gist.github.com/drifterz28/6971440

function toDeci(fraction) {
    fraction = fraction.toString();
    var result,wholeNum=0, frac, deci=0;
    if(fraction.search('/') >=0){
        if(fraction.search('-') >=0){
            wholeNum = fraction.split('-');
            frac = wholeNum[1];
            wholeNum = parseInt(wholeNum,10);
        }else{
            frac = fraction;
        }
        if(fraction.search('/') >=0){
            frac =  frac.split('/');
            deci = parseInt(frac[0], 10) / parseInt(frac[1], 10);
        }
        result = wholeNum+deci;
    }else{
        result = fraction
    }
    return result;
}

/* Testing values / examples */
console.log('1 ',toDeci("1-7/16"));
console.log('2 ',toDeci("5/8"));
console.log('3 ',toDeci("3-3/16"));
console.log('4 ',toDeci("12"));
console.log('5 ',toDeci("12.2"));
Run Code Online (Sandbox Code Playgroud)


Jam*_*rey 5

函数(ES6):

function fractionToDecimal(fraction) {
  return fraction
    .split('/')
    .reduce((numerator, denominator, i) =>
      numerator / (i ? denominator : 1)
    );
}
Run Code Online (Sandbox Code Playgroud)

函数(ES6,精简):

function fractionToDecimal(f) {
  return f.split('/').reduce((n, d, i) => n / (i ? d : 1));
}
Run Code Online (Sandbox Code Playgroud)

例子:

fractionToDecimal('1/2');     // 0.5
fractionToDecimal('5/2');     // 2.5
fractionToDecimal('1/2/2');   // 0.25
fractionToDecimal('10/5/10'); // 0.2
fractionToDecimal('0/1');     // 0
fractionToDecimal('1/0');     // Infinity
fractionToDecimal('cat/dog'); // NaN
fractionToDecimal('42');      // 42
Run Code Online (Sandbox Code Playgroud)