22
2024
06

小数转分数2

之前写过一篇小数转分数的文章。

最初是在化学方程式自动配平中要用到。

前段时间看小学课本,小学学的是,先转成分数,再约分。比如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。



« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。