之前写过一篇小数转分数的文章。
最初是在化学方程式自动配平中要用到。
前段时间看小学课本,小学学的是,先转成分数,再约分。比如0.5,先转成5/10,10分之5,再约分。
之前那篇文章是不是我想多了。直接用小学学到的方法是不是就行。
我试了试。
比如1/3,三分之一。
function getGCD(num1, num2){
let temp;
while (num2 !== 0) {
temp = num1 % num2;
num1 = num2;
num2 = temp;console.log(temp)
}
return num1;
}
var a = 1/3;
var b = a.toString().split(".")[1].length;
var c = a*Math.pow(10,b);
var d = Math.pow(10,b+1);
var e = getGCD(c,d);
console.log(a,b,c,d,e,c/e,d/e);输出结果为:
0.3333333333333333 16 3333333333333333 100000000000000000 1 3333333333333333 100000000000000000
可以看出,并没有化简成功。
按照之前的方法
function toFraction(d){
var numerators = [0, 1];
var denominators = [1, 0];
var d2 = d;
var calcD, prevCalcD;
for (var i = 2; i < 1000; i++) {
var L2 = Math.floor(d2);
var numerator = L2 * numerators[i-1] + numerators[i-2];
var denominator = L2 * denominators[i-1] + denominators[i-2];
calcD = numerator / denominator;
if (calcD == prevCalcD) {
break;
}
numerators[i] = numerator;
denominators[i] = denominator;
if (calcD == d) {
break;
}
prevCalcD = calcD;
d2 = 1 / (d2-L2);
if(d2 > 1e6){
break;
}
}
return {
a: numerators[numerators.length - 1],
b: denominators[denominators.length - 1]
};
}
toFraction(1/3)输出结果为
{a: 1, b: 3}
能成功得到1/3。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。