我正在尝试创建一个javascript函数,它可以采用分数输入字符串,例如'3/2'
,并将其转换为十进制 - 字符串'1.5'
或数字1.5
function ratio(fraction) {
var fraction = (fraction !== undefined) ? fraction : '1/1',
decimal = ??????????;
return decimal;
});
有办法做到这一点吗?
答案 0 :(得分:40)
由于还没有人提及它,因此有一个快速而肮脏的解决方案:
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
这里的人们会很快提到使用原始评估的危险,但我提交这个作为懒人的答案。
答案 1 :(得分:15)
以下是执行此操作所需的最简单代码:
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/
需要考虑的事项:
答案 2 :(得分:6)
这样的事情:
bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
答案 3 :(得分: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"));
答案 4 :(得分:2)
我有一个函数用于处理整数,混合分数(包括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"
。
答案 5 :(得分:1)
太晚了,但可以提供帮助:
您可以使用Array.prototype.reduce
代替eval
{{3}}
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。
答案 6 :(得分: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>
&#13;
答案 7 :(得分: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"
答案 8 :(得分:0)
它适用于eval()方法,但您可以使用parseFloat方法。我觉得它更好! 不幸的是,它只适用于那种值 - “12.2”而不是“5/8”,但由于你可以处理计算,我认为这是一个很好的方法!
答案 9 :(得分:0)
要将分数转换为小数,只需将顶部数字除以底部数字。 5除以3将是5/3或1.67。很像:
function decimal(top,bottom) {
return (top/bottom)
}
希望这有帮助,哈哈
答案 10 :(得分:0)
功能(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
答案 11 :(得分:0)
聚会也有点晚,但是eval()
工厂是Function()
工厂的替代品,安全问题较少(至少根据MDN而言)。
var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );
这将在控制台中输出结果“ 1.5”。
也要注意:像1 1/2这样的混合分数既不适用于eval()
也不适用Function()
的解决方案,因为它们都偶然发现了空间。
答案 12 :(得分:0)
根据MDN更安全的eval()
const safeEval = (str) => {
return Function('"use strict";return (' + str + ")")();
}
safeEval("1 1/2") // 1.5
答案 13 :(得分: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
答案 14 :(得分: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"
答案 15 :(得分: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;
}
答案 16 :(得分:0)
我开发了一个函数,可以使用可以作为整数或小数的分数传递的因子来转换值。用户输入和转换因子的格式可能不正确,因此它会检查原始值是否为数字,以及假设 /number 表示 1/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;
}
}