Преобразовать фракцию в десятичную?
Я пытаюсь создать функцию javascript, которая может принимать входную строку дробной части, такую как '3/2'
, и преобразовать ее в десятичную - либо в виде строки '1.5'
, либо в число 1.5
function ratio(fraction) {
var fraction = (fraction !== undefined) ? fraction : '1/1',
decimal = ??????????;
return decimal;
});
Есть ли способ сделать это?
Ответы
Ответ 1
Поскольку никто еще не упомянул об этом, есть быстрое и грязное решение:
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
Люди здесь будут быстро упомянуть об опасности использования необработанного eval, но я представляю это как ленивый ответ mans.
Ответ 2
Вот минимальный код для костей, который нужно сделать:
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)
Ответ 3
Что-то вроде этого:
bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
Ответ 4
Я создал хорошую функцию, чтобы сделать это, все было основано на этом вопросе и ответах, но он будет принимать строку и выводить десятичное значение, а также выводить целые числа также без ошибок
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"));
Ответ 5
У меня есть функция, которую я использую для обработки целых чисел, смешанных фракций (включая символы символов вульвы 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"
.
Ответ 6
Слишком поздно, но может быть полезно:
Вы можете использовать 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
[EDIT] Удалено начальное значение редуктора, и теперь функция работает для числителей больше 1. Спасибо, Джеймс Фьюри.
Ответ 7
Если вы не возражаете использовать внешнюю библиотеку, 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>
Ответ 8
Чтобы преобразовать дробь в десятичную, просто разделите верхнее число на нижнее число. 5, разделенное на 3, будет 5/3 или 1,67. Очень похоже:
function decimal(top,bottom) {
return (top/bottom)
}
Надеюсь, это поможет, хаха
Ответ 9
Он работает с методом eval(), но вы можете использовать метод parseFloat. Я думаю, что это лучше!
К сожалению, он будет работать только с такими значениями - "12.2", а не с "5/8", но поскольку вы можете справиться с расчетами, я думаю, что это хороший подход!
Ответ 10
Если вы хотите использовать результат как дробь, а не просто получить ответ от строки, то библиотека, такая как 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"
Ответ 11
Функция (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
Ответ 12
Также немного опоздал на вечеринку, но альтернативой eval()
с меньшими проблемами безопасности (по крайней мере, согласно MDN) является фабрика Function()
.
var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );
Это выведет результат "1.5" в консоль.
Также как примечание: смешанные дроби, такие как 1 1/2, не будут работать ни с eval()
ни с решением с помощью Function()
как написано, поскольку они оба натыкаются на пространство.
Ответ 13
более безопасный eval() согласно MDN
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 !
Ответ 14
Это тоже будет работать:
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