скажем, у нас есть дробь 2/4
, ее можно сократить до 1/2
.
Есть ли функция JavaScript, которая может выполнять сокращение?
скажем, у нас есть дробь 2/4
, ее можно сократить до 1/2
.
Есть ли функция JavaScript, которая может выполнять сокращение?
Нет, но вы можете довольно легко написать его самостоятельно. По сути, вам нужно разделить верхнюю и нижнюю части дроби на их «наибольший общий знаменатель»... Который вы можете рассчитать по алгоритму Евклида.
Подробнее читайте здесь: http://www.jimloy.com/number/euclids.htm а>
редактировать:
код (потому что все, кажется, делают это, хотя это не использует рекурсию)
var FractionReduce = (function(){
//Euclid's Algorithm
var getGCD = function(n, d){
var numerator = (n<d)?n:d;
var denominator = (n<d)?d:n;
var remainder = numerator;
var lastRemainder = numerator;
while (true){
lastRemainder = remainder;
remainder = denominator % numerator;
if (remainder === 0){
break;
}
denominator = numerator;
numerator = remainder;
}
if(lastRemainder){
return lastRemainder;
}
};
var reduce = function(n, d){
var gcd = getGCD(n, d);
return [n/gcd, d/gcd];
};
return {
getGCD:getGCD,
reduce:reduce
};
}());
alert(FractionReduce.reduce(3413358, 13427));
Чтобы уменьшить дробь, разделите числитель и знаменатель на наибольший общий делитель. Фрогз и Дэвид уже предоставили исходный код.
Однако, если вы ищете библиотеки javascript для обработки дробей, вот несколько на выбор.
Вот пример использования Ratio.js.
var a = Ratio(2,4);
a.toString() == "2/4";
a.simplify().toString() == "1/2"; // reduce() returns a clone of the Ratio()
a.toString() == "2/4"; // Ratio functions are non-destructive.
Я знаю, что ответ уже есть, но я хочу поделиться библиотекой JS, которую я нашел, когда искал что-то для преобразования десятичных чисел в дроби и сокращения дробей.
Библиотека вызывает Fraction.js, что очень помогло мне и сэкономило мне много времени и работы. . Надеюсь, это может быть очень полезно для кого-то еще!
Я знаю, что это старый пост, но я преобразовал принятый ответ в решение цикла вместо рекурсивной функции. Это было бы намного эффективнее с точки зрения памяти и, вероятно, намного быстрее (не требуются операции стека памяти и вызовы выполнения).
function reduce(numerator, denominator) {
var a = numerator;
var b = denominator;
var c;
while (b) {
c = a % b; a = b; b = c;
}
return [numerator / a, denominator / a];
}
Объем памяти составляет всего 5 числовых структур и простой цикл.
Вот рекурсивная функция, использующая сокращение ECMAScript 6. Он работает для большинства дробей, если остаток не слишком мал. 0 был переопределен, чтобы он работал с такими массивами, как [1.2, 2.4, 12, 24]. Я тестировал в Chrome и IE Edge, поэтому он может вести себя по-разному в других браузерах или обновлениях. Так что он должен работать с массивом поплавков.
Array.prototype.gcd = function () {
if (this.length === 0)
return null;
return this.reduce((prev, curr) => {
if (curr <= 1.00000000001e-12)
return prev
else
return [curr, prev % curr].gcd();
});
}
var reducedValueGCD = [1.2, 2.4, 12, 24, 240].gcd();
Найдите сокращение MDN или дополнительную информацию здесь .
Сократите строковую дробь, например «2/4», и выведите в виде строковой дроби.
function reduce([numerator, denominator]){
for (let i = numerator; i > 0; i--) {
if(!(numerator % i) && !(denominator % i)){
return [(numerator / i), (denominator / i)];
}
}
}
function reduceFraction(string){
return reduce(string.split('/').map(n => +n)).join('/');
}
one = '2/4';
two = '20/200';
three = '330/2050';
console.log('2/4 reduced to', reduceFraction(one));
console.log('20/200 reduced to', reduceFraction(two));
console.log('330/2050 reduced to', reduceFraction(three));
В дополнение к Яну я бы изменил его функцию на:
function reduce(numerator,denominator){
var roundNr = 0
if(numerator >= denominator) {
roundNr = Math.floor(numerator / denominator);
numerator -= (roundNr * denominator);
}
var gcd = function gcd(a,b){
return b ? gcd(b, a%b) : a;
};
gcd = gcd(numerator,denominator);
return {roundNr: roundNr, numerator: numerator/gcd, denominator: denominator/gcd}; }
Это также вернет круглое число, когда числитель ›= знаменатель.
gcd
функция. Единственное изменение, которое я бы предложил, - это некоторая форма проверки ввода для NaN
, поскольку gcd(NaN, 1)
выдает 1
, где я ожидал бы NaN
или ошибку.
- person zzzzBov; 09.11.2012
if (isNaN(numerator) || isNaN(denominator)) return NaN;
в качестве первой строки.
- person Phrogz; 08.01.2013
reduce(Math.round(.25 * 4), 4))
это сохранит небольшие (оценочные) значения, привязанные к максимальному знаменателю, который вы ему даете.
- person dmarr; 16.10.2018
gcd
, а затем присваивать числовой результат той же переменной? Это плохой этикет JavaScript.
- person Rudey; 21.12.2020