javascript - 将循环小数转换为分数

标签 javascript decimal fractions

我正在使用 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 的新手,我很茫然。

最佳答案

使用此选项并在最多 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
  • 如果输入未定义,则返回未定义
  • 减少分数
  • 返回一个字符串(使用Math.fraction(2.56).split("/")作为包含分子和分母的数组)

请注意,这使用了已弃用的 arguments.callee,因此在某些浏览器中可能不兼容。

测试一下 here

关于javascript - 将循环小数转换为分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745862/

相关文章:

javascript - 在 typescript 中获取类的属性

javascript - 将 mouseleave 函数添加到 div 中的多个 Accordion ?

c - 如何在C中将二进制数转换为两位十进制数

javascript - javascript中的双值

再次 Java 分数

python - 在 Python 的 Fraction 模块中使用 numpy 向量元素

python类分数

javascript - 在数组中设置关联数组值

javascript - 一个页面中对 JQuery 库的多次引用

C++ 将十进制小时转换为小时、分钟和秒