Преобразование повторяющейся десятичной дроби в дробь

Я использую кнопку на научном калькуляторе JavaScript для преобразования десятичных чисел в дроби с помощью этого кода:

$('#button-frac').click(function(){
var factor; 

    // Finds the highest common factor of 2 numbers
    function highestCommonFactor() {
        for (factor = numerator; factor > 0; factor--) {
            if ((numerator % factor == 0) && (denominator % factor == 0)) {
                return factor;
            }
        }
    }

    // Enter a decimal to convert to a fraction
    var decimal = this.form.display.value;

    // Split the decimal
    var decimalArray = decimal.split(".");

    var leftDecimalPart = decimalArray[0];
    var rightDecimalPart = decimalArray[1];

    // Save decimal part only for later use
    var decimalOnly = "0." + rightDecimalPart;

    // Find the decimal multiplier
    var multiplier = "1";

    for (var i = 0; i < rightDecimalPart.length; i++) {
        multiplier += "0";
    }

    // Create numerator by multiplying the multiplier and decimal part together
    var numerator = Number(multiplier) * Number(decimalOnly);

    var denominator = multiplier;

    // Find the highest common factor for the numerator and denominator
    highestCommonFactor();

    // Simplify the fraction by dividing the numerator and denominator by the factor
    var numerator = Number(numerator) / Number(factor);
    var denominator = Number(denominator) / Number(factor);

    // Output as a mixed number fraction (depending on input)
    var mixedNumber = leftDecimalPart + " " + numerator + "/" + denominator;

    // Output as a proper fraction or improper fraction (depending on input)
    var numerator = numerator + (leftDecimalPart * denominator);
    var fraction = numerator + "/" + denominator;

    // Display solution in input #disp
    $('#disp').val(fraction);
});

Это работает хорошо, но если десятичная дробь не завершается и повторяется, происходит сбой сценария. Любая идея, как я могу решить эту проблему? Возможно, есть способ проверить, повторяется ли десятичное число, и определить длину повторяющейся строки, а затем взять эту строку и выразить ее числом с равным количеством цифр, все 9? Будучи относительно новичком в JavaScript, я в растерянности.


person newbie2015    schedule 12.01.2016    source источник
comment
Можете ли вы преобразовать свой код, чтобы предоставить нам рабочий пример? Это обычное правило в stackoverflow: stackoverflow.com/help/mcve   -  person Marcos Pérez Gude    schedule 12.01.2016
comment
@MarcosPérezGude Вот скрипка: jsfiddle.net/4fbuyxqt/1   -  person newbie2015    schedule 13.01.2016
comment
@MarcosPérezGude Введите 1/3, а затем кнопку дроби, и вы увидите мою дилемму.   -  person newbie2015    schedule 15.01.2016


Ответы (1)


Используйте это и округляйте десятичную дробь после не более 20 повторяющихся символов.

Math.fraction=function(x){
return x?+x?x.toString().includes(".")?x.toString().replace(".","")/(function(a,b){return b?arguments.callee(b,a%b):a;})(x.toString().replace(".",""),"1"+"0".repeat(x.toString().split(".")[1].length))+"/"+("1"+"0".repeat(x.toString().split(".")[1].length))/(function(a,b){return b?arguments.callee(b,a%b):a;})(x.toString().replace(".",""),"1"+"0".repeat(x.toString().split(".")[1].length)):x+"/1":NaN:void 0;
}

Назовите это с помощью Math.fraction(2.56)

Так и будет:

  • вернуть NaN, если ввод не является числом
  • вернуть undefined, если ввод не определен
  • уменьшить дробь
  • вернуть string (используйте Math.fraction(2.56).split("/") для массива, содержащего числитель и знаменатель)

Обратите внимание, что здесь используется устаревший arguments.callee, поэтому он может быть несовместим с некоторыми браузерами.

Test it here

person Samuel Williams    schedule 15.11.2017
comment
Как я могу изменить его по порядку после 15 повторных символов? - person Alexandro Palacios; 01.08.2021