之前写过一篇小数转分数的文章。
最初是在化学方程式自动配平中要用到。
前段时间看小学课本,小学学的是,先转成分数,再约分。比如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。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。