30

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

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

有没有办法做到这一点?

4

17 回答 17

51

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

var decimal = eval(fraction); 

它具有正确评估各种数学字符串的好处。

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

这里的人们会很快提到使用原始评估的危险,但我将其提交为懒惰的人的答案。

于 2011-08-22T02:49:09.243 回答
22

这是执行此操作所需的最基本的最少代码:

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

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

需要考虑的事项:

  • 被零除
  • 如果用户给你一个整数而不是分数,或者任何其他无效输入
  • 舍入问题(例如 1/3)
于 2011-08-22T02:42:39.233 回答
6

像这样的东西:

bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
于 2011-08-22T02:40:58.527 回答
6

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

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"));
于 2013-10-14T16:14:47.190 回答
4

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

输入"2 1/2", "2½","2 ½""2.5"都将返回2.5。例子:

var numQty = require("numeric-quantity");

numQty("1 1/4") === 1.25;  // true
numQty("3 / 4") === 0.75;  // true
numQty("¼" ) === 0.25;     // true
numQty("2½") === 2.5;      // true
numQty("¾") === 0.75;      // true
numQty("⅓") === 0.333;     // true
numQty("⅔") === 0.667;     // true

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

于 2015-03-20T16:11:45.317 回答
3

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

您可以使用Array.prototype.reduce而不是eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

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

CJS

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

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

于 2017-11-20T23:42:24.317 回答
2

功能(ES6):

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

功能(ES6,精简):

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

例子:

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
于 2018-03-13T00:03:23.880 回答
1

如果您不介意使用外部库,math.js提供了一些有用的函数来将分数转换为小数以及执行小数运算。

console.log(math.number(math.fraction("1/3"))); //returns 0.3333333333333333
console.log(math.fraction("1/3") * 9) //returns 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.20.1/math.js"></script>

于 2018-01-30T12:27:44.000 回答
0

要将分数转换为小数,只需将顶部数字除以底部数字即可。5 除以 3 将是 5/3 或 1.67。很像:

function decimal(top,bottom) {
    return (top/bottom)
}

希望对你有帮助,哈哈

于 2013-02-20T00:28:14.900 回答
0

它适用于 eval() 方法,但您可以使用 parseFloat 方法。我觉得这样更好!不幸的是,它只适用于那种值——“12.2”而不是“5/8”,但因为你可以处理计算,我认为这是个好方法!

于 2014-01-21T12:55:32.000 回答
0

如果您想将结果用作分数,而不仅仅是从字符串中获取答案,那么像https://github.com/infusion/Fraction.js这样的库可以很好地完成这项工作。

var f = new Fraction("3/2");
console.log(f.toString()); // Returns string "1.5"
console.log(f.valueOf()); // Returns number 1.5

var g = new Fraction(6.5).div(.5);
console.log(f.toString()); // Returns string "13"
于 2015-06-04T11:31:34.117 回答
0

派对也有点晚了,但eval()安全问题较少的替代方案(至少根据 MDN)是Function()工厂。

var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );

这将在控制台中输出结果“1.5”。

另外作为旁注:像 1 1/2 这样的混合分数既eval()不能使用,也不能使用所写的解决方案,Function()因为它们都在空间上绊倒。

于 2018-07-25T21:40:34.553 回答
0

根据 MDN 更安全的 eval()

const safeEval = (str) => {
   return Function('"use strict";return (' + str + ")")();
}

safeEval("1 1/2") // 1.5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval

于 2019-03-03T00:56:50.423 回答
0

这也将起作用:

let y = "2.9/59"
let a = y.split('')
let b = a.splice(a.indexOf("/"))
console.log(parseFloat(a.join('')))
a = parseFloat(a.join(''))
console.log(b)
let c = parseFloat(b.slice(1).join(''))
let d = a/c
console.log(d) // Answer for y fraction
于 2019-07-02T14:18:17.480 回答
0

const fractionStringToNumber = s => s.split("/").map(s => Number(s)).reduce((a, b) => a / b);

console.log(fractionStringToNumber("1/2"));
console.log(fractionStringToNumber("1/3"));
console.log(fractionStringToNumber("3/2"));
console.log(fractionStringToNumber("3/1"));
console.log(fractionStringToNumber("22/7"));
console.log(fractionStringToNumber("355 / 113"));
console.log(fractionStringToNumber("8/4/2"));

console.log(fractionStringToNumber("3")); // => 3, not "3"

于 2020-01-12T19:04:30.180 回答
0

从可读性、逐步调试的角度来看,这可能更容易理解:

// i.e. '1/2' -> .5
// Invalid input returns 0 so impact on upstream callers are less likely to be impacted
function fractionToNumber(fraction = '') {
    const fractionParts = fraction.split('/');
    const numerator = fractionParts[0] || '0';
    const denominator = fractionParts[1] || '1';
    const radix = 10;
    const number = parseInt(numerator, radix) / parseInt(denominator, radix);
    const result = number || 0;

    return result;
}
于 2020-03-18T16:37:02.200 回答
0

我开发了一个函数来使用可以作为整数或小数的分数传递的因子来转换值。用户输入和转换因子的格式可能不正确,因此它会检查原始值是否为数字,以及假设 /number 表示 1/number 时是否可以将转换转换为分数,或者有分子和分母,格式为 number/number。

/**
 * Convert value using conversion factor
 * @param {float} value - number to convert
 * @param {string} conversion - factor
 * @return {float} converted value
 */
function convertNumber(value, conversion) {
  try {
    let numberValue = eval(value);
    if (isNaN(numberValue)) {
      throw value + " is not a number.";
    }
    let fraction = conversion.toString();
    let divider = fraction.indexOf("/");
    let upper = 1;
    let denominator = 1;
    if (divider == -1) {
      upper = eval(fraction);
    } else {
      let split = fraction.split("/");
      if (split.length > 2) {
        throw fraction + " cannot be evaluated to a fraction.";
      } else {
        denominator = eval(split[1]);
        if (divider > 0) {
          upper = eval(split[0]);
        }
      }
    }
    let factor = upper/denominator;
    if (isNaN(factor)) {
      throw fraction + " cannot be converted to a factor.";
    }
    let result = numberValue * factor;
    if (isNaN(result)) {
      throw numberValue + " * " + factor + " is not a number.";
    }
    return result
  } catch (err) {
    let message = "Unable to convert '" + value + "' using '" + conversion + "'. " + err;
    throw message;
  }
}
于 2021-03-18T18:58:49.140 回答