我正在使用 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/