`
qingdaoguy
  • 浏览: 24325 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

分数与无限循环小数的相互转换

 
阅读更多

       分数转化为小数如果不是有限的,那么必然是无限循环小数,原因很简单:对于一个分数p/q,由于q是有限的,模q的结果也是有限的,而得到p/q结果的过程,可以看做0—q-1个数中的一个构成p,迭代p/q的过程,所以必然会出现循环,如果结果是无限的,必然为无限循环小数。

    这里就无限循环小数与其对应的分数用java语言来实现其转换过程,其中的无限循环小数的表示形式满足正则表达式“\d\.\d*\[\d{m}\]”,例 0.[3]是分数1/3的无限循环表示,[]中为循环节。其转换原理较为简单,网上随便搜索即可得,故这里不做细究。其代码如下:望批评指正。

 

package com.yh.math;

import java.util.Arrays;

public class FractionAndRecurringDecimal {

	/**
	 * get lcm of x and y
	 * 
	 * @param x
	 * @param y
	 * @return lcm of x and y,the type is long
	 */
	public static long getLcm(long x,long y){
		if(x<y)
			return getLcm(y,x);
		
		if(y == 0){
			System.out.println("ErrorMsg:@Lcd method the parameters are wrong!");
			return 0;
		}
			
		long remainder = x % y;
		if(remainder == 0)
			return y;
		else
			return getLcm(y,remainder);
	}
	
	
	/**
	 * from a fraction to a finite or unfinite recurring decimal
	 * 
	 * @param numInt	 numerator 
	 * @param denoInt	 denominator  
	 * @return String    the recurring decimal of the fraction 
	 */
	public static String fra2RecDec(int numInt , int denoInt  ){
		
		int divider = numInt / denoInt;
		numInt = numInt % denoInt;
		
		int lcm = (int)getLcm(numInt,denoInt);
		if(lcm != 1 && lcm != 0){
			numInt = numInt / lcm;
			denoInt = denoInt / lcm;
		}
		
		boolean markArr[] = new boolean[denoInt*10];
		int resuArr[] = new int[1000];
		int resuIndex[] = new int[denoInt*10];
		Arrays.fill(markArr, false);
		Arrays.fill(resuArr, -1);
		Arrays.fill(resuIndex, -1);
		
		int startIndex = -1;
		
		
		int index = -1;
		numInt = numInt * 10;
		while(true){
			index++;
			int remainder = numInt %denoInt;
			
			if(remainder == 0)
				break;		
		
			if(markArr[numInt]){
				startIndex = resuIndex[numInt];
				break;
			}
			else{
				markArr[numInt] = true;
				resuIndex[numInt] = index;
			}			
			
			resuArr[index] = numInt / denoInt;
			numInt = remainder * 10;
		}
		
		StringBuffer resuSB = new StringBuffer();
		resuSB.append(divider);
		resuSB.append(".");
		for(int i=0;i<denoInt;i++){		
			if(resuArr[i] == -1)
				break;
			if(i == startIndex)
				resuSB.append("[");
			resuSB.append(resuArr[i]);
		}
		if(startIndex != -1)
			resuSB.append("]");
		
		return resuSB.toString();
	}
	
	
	/**
	 * get the result of the pow(10,index)
	 * 
	 * @param index
	 * @return pow(10,index)
	 */
	private static long getTenBasePow(int index){
		return (long)Math.pow(10, index);
	}
	
	
	/**
	 * get a number which every digit of the number is the same digit,
	 * and the length is index
	 * 
	 * @param index    the length of the number
	 * @param data     the same data
	 * @return long
	 */
	private static long getAsideData(int index,int data){
		long resu = 0;
		for(int i=0;i<index;i++){
			resu = resu*10 + data;
		}
		return resu;
	}
	
	
	/**
	 * from a recurring decimal to fraction
	 * 
	 * @param recDecStr  the recurring decimal 
	 * @return  fraction
	 */
	public static String recDec2Fra(String recDecStr){
		
		int dotPos = recDecStr.indexOf(".");
		int leftBrcPos = recDecStr.indexOf("[");
		int rightBrcPos = recDecStr.indexOf("]");
		
		
		if(dotPos == -1 || leftBrcPos == -1 || rightBrcPos == -1){
			System.out.println("ErrorMsg:@recDec2Fra method  the parameters are wrong!");
		}
		
		int preNum = leftBrcPos - dotPos - 1 ;
		int recNum = rightBrcPos - leftBrcPos - 1;
		
		
		long intData = Integer.parseInt(recDecStr.substring(0, recDecStr.indexOf(".")));
		long preData = 0;
		if(preNum != 0)
			preData = Integer.parseInt(recDecStr.substring(dotPos+1,leftBrcPos));
		long recData = Integer.parseInt(recDecStr.substring(leftBrcPos+1,rightBrcPos));
		
		
		long numLong = recData * (preNum ==0?1:preData);
		long denoLong = getTenBasePow(preNum) * getAsideData(recNum,9);
		
		long lcm = getLcm(numLong,denoLong);
		if(lcm != 0 && lcm != 1){
			numLong = numLong / lcm;
			denoLong = denoLong / lcm;
			numLong = numLong +  intData * denoLong ; 
		}
		
		return numLong + "/" + denoLong;
	}
	
	//test the functions
	public static void main(String args[]){
		System.out.println(fra2RecDec(16, 7));
		System.out.println(recDec2Fra("2.[285714]"));
	}
	
}

 

分享到:
评论

相关推荐

    奥数之循环小数讲解学习.pdf

    总的来说,掌握循环小数的概念、分类以及它们与分数的相互转化关系,是解决奥数问题,尤其是涉及小数运算问题的关键。理解并熟练运用上述规则,不仅可以帮助学生更好地理解数学原理,也能在实际解题过程中提高效率和...

    五年级数学循环小数PPT学习教案.pptx

    循环小数是数学中的一个重要概念,特别是在小学高年级的学习中,它是分数与小数相互转换的一个关键点。循环小数是指在除法运算中,当被除数不能被除数整除时,得到的小数部分从某一位开始,有一串数字无限重复出现。...

    小学五年级上册数学《循环小数》教案(图片版).doc

    同时,也可以用分数与小数的关系,让学生理解为什么有些分数能转化为循环小数,比如1/7 = 0.142857142857...。 表示循环小数有几种方法:一是用点和括号,例如,0.333...可以写为0.(3);二是用分数形式,如0....

    分数与小数的互化.pdf

    的分数转化成小数的方法",教师可以引导学生通过实例逐步理解,如将4/11转化为小数,让学生尝试除法运算,然后讨论如何确定循环节,以及如何用分数形式表示无限循环小数。同时,教师还可以强调对于无限不循环小数...

    分数和小数互化.docx

    在数学中,分数和小数是两种不同的数值表示方式,它们可以互相转换,以适应不同情境下的计算需求。本课时主要围绕分数和小数的互化展开,旨在帮助学生理解和掌握这两种数值形式的转化方法。 首先,我们要理解分数...

    五年级数学下册2分数2.5分数与小数教学反思素材西师大版

    例如,分数\( \frac{1}{3} \)不能转化为有限小数,因为其无限循环的小数表示为0.333...。为了让学生掌握这一规律,教师会引导他们进行分数的质因数分解。通过分析能化成有限小数的分数(如\( \frac{1}{2} \), \( \...

    人教五年级上册循环小数公开课PPT学习教案.pptx

    这一概念通常在五年级的学生中进行教学,帮助他们理解分数与小数的相互转换,以及无限循环现象在数学上的表达。 循环小数的定义是:当一个小数部分从某一位开始,一个数字或几个数字按照一定的顺序不断重复,这样的...

    新北师大数学五年级分数王国与小数王国.pptx

    这种方法对于有理数(即可以表示为两个整数比例的数)特别有效,因为它们都能被准确地转换为有限小数或无限循环小数。 其次,将小数转化为分数。例如,0.06可以写为6除以100,简化后为1006,即1006。同样,0.6可以...

    fenshujisuanqi.rar_小数 分数

    对于不能精确除尽的分数,其小数部分可能是无限循环的。 同样,分数也可以转化为带分数,这是一种混合形式,包含一个整数和一个真分数。例如,假分数3/2可以转换为1又1/2,其中1是整数部分,1/2是真分数部分。这种...

    五年级数学下册分数和小数的互换PPT学习教案.pptx

    在处理无限循环小数时,可能需要按照四舍五入法保留特定位数的小数。 此外,教程还提醒学生注意分数化成小数时的规则,如0.8表示8个十分之一,即8/10;0.05表示5个百分之一,即5/100。通过填空题和连线题,巩固学生...

    六年级数学下册总复习1数与代数1.4小数分数百分数课堂精练北师大版202003061147

    第三部分是对小数大小的比较,这需要学生理解小数点的位置和无限循环小数的概念。0.034是最小的,因为它只有两位小数;接着是0.304304…,这是一个无限循环小数,循环节是304;然后是0.34,它是一个有限小数;0.34·...

    两个国王斗法.docx

    故事中,110国王拥有一个名为“等号变换器”的神奇法宝,可以将无限循环小数转化为分数。这个过程揭示了一个数学概念,即无限循环小数与分数之间的等价关系。无限循环小数可以通过一定的规则转换成分数,这是数学中...

    百分数和分数、小数的互化.doc

    在处理无法直接化成有限小数的分数时,需要将其转换为无限循环小数,然后按照上述步骤进行。 其次,百分数转化为小数则相反,需要移除百分号并将小数点向左移动两位。例如,2.7%转化为小数就是0.027,124%转化为...

    人教版五年级数学下册分数和小数的互化课件PPT学习教案.pptx

    - 对于无限循环小数,可以通过短除法或者倍数关系将其转换为分数。 4. **分数化小数**: - 分母是10、100、1000等的分数可以直接转化为小数,将分子放到小数点右边相应的位置上。如1/10=0.1,23/100=0.23。 - ...

    小数分数百分数和比练习题精选.doc

    此外,了解有限小数和无限循环小数的区别,0.767676是无限重复小数,而并非循环小数。 7. **实际应用**:例如,分母是10的所有最简真分数的和可以通过计算1/10 + 3/10 + 7/10 + 9/10 = 2,这涉及到分数的加法。因数...

    六下数学毕业总复习小数分数百分数和比PPT教案学习.pptx

    7. **分数、小数、百分数的互化**:三者之间可以互相转换,例如,分数25/100可以转换为小数0.25,也可以转换为百分数25%。 8. **分数与除法、分数与比的关系**:分数的分子相当于除法中的被除数,分母相当于除数,...

    六年级数学下册总复习1数学代数1.5分数和百分数课时练北京版202003201151

    题目第三部分要求将几个小数按大小顺序排列,其中包括有限小数、无限循环小数和无限不循环小数。如0.034是最小的,因为它只有一位小数;接着是0.304304…,它是一个无限循环小数,且循环部分只有一个数字04;0.34是...

    百分数分数小数互化.doc

    例如,8/7 = 1.142857(无限循环小数)。 4. 百分数转化为分数: - 将百分数除以100得到小数,然后将小数转化为最简分数。例如,25%除以100得到0.25,0.25可以转化为25/100,简化为1/4。 5. 百分数转化为小数: ...

    小学数学数学故事奇妙的数王国12两个国王斗法

    110国王使用等号变换器将无限循环小数转换成分数,这体现了数学中的一种等价转换思想。例如,0.999... 可以理解为9/9,通过连续加9自身,最终等于1。 故事还涉及了加法运算,3个0.333... 通过加法结合成0.999...,...

    五年级下数学一课一练-分数和小数的互化-人教版(附答案).docx

    《五年级下数学一课一练-分数和小数的互化》是针对人教版小学五年级下学期数学课程的一份练习材料,主要涵盖了分数与小数相互转化的技能训练。这部分内容对于理解基本的数学概念至关重要,因为它涉及到小数和分数...

Global site tag (gtag.js) - Google Analytics