输入一个小数,将其转化为分数并输出 java

小数转化为分数并输出 java

问题简述:输入一个数(整数位数不超过7位,小数位数不超过7位,且不为负数),将其转化为分数并输出。
示例:
输入为0.5
输出为0 1 2
其中第一个位置代表整数的值,第二个位置为分子,第三个位置为分母,可见,所输出的值是化简过后的值。

已经所要输出的分为,整数,分子,分母三个部分。

故首先,我们编写zhengShu()方法,来确定所输入数的整部部分的值的大小。
代码如下:

/**确定整数部分*/
	public int getZhengShu(double set) {

		if(set - 1 > 0) {
			return  (int)set;
		//使用强制类型转换去掉浮点数部分
		}
		return 0;//否则返回0
	}

已知最小正整数为1,所以若 set - 1 > 0,则表示set的整数部分非零,我们便将set的整数部分单独返回,否则返回0.

整数部分解决之后,我们再来解决分子部分。
代码如下:

// /**初步确定分子大小
	 * 未化简*/
	public double fenZi(double set) {
		//调用BigDecimal类
		BigDecimal b1 = new BigDecimal(Double.toString(set)); 
		//set的整数部分
		BigDecimal b2 = new BigDecimal(zhengShu(set));
		/**即b1 - b2
		 * 此时set为原来的小数部分
		 * 即0.``````*/
		set =  b1.subtract(b2).doubleValue(); 
		/**因为小数部分不超过7位
		 * 故先将其乘以10的七次方,再对10求余
		 * 若个位为零,则set除以10
		 * 直到set的个位不为0为止
		 * 此时的数即为分子部分
		 * */
		set *= (int)Math.pow(10, 7);
		while(set % 10 == 0) {
			set /= 10;
		}
		set *= 10;
		
		return set;
	}

求得一个数的小数部分有许多方法,我不多赘述。
这边我是通过用原来的输入的值减去整数部分的方法来得到小数部分的值的大小。
需注意的是,计算机是通过二进制来进行换算的。
所以若是直接使用 “double - int”的话,所得到的结果将不是原先的小数部分。
示例:
double a = 1.1;
int b = 1;
c = a - b;
此时的c的值将不为0.1;
所以这里调用了BigDecimal()类来解决该问题。

解决分子的问题后,分母也就好计算了。
代码如下:

// /**初步确定分母的大小
	 * 未化简
	 * */
	public double fenMu(double set) {
		/**...*/
		BigDecimal b1 = new BigDecimal(Double.toString(set)); 
		BigDecimal b2 = new BigDecimal(zhengShu(set)); 
		set =  b1.subtract(b2).doubleValue(); 
		/**分母的次方
		 * 以10为底*/
		int i = 7;
		/**每消去个位的一个0
		 * i--,即分母除以10*/
		set *= (int)Math.pow(10, 7);
		while(set % 10 == 0) {
			set /= 10;
			i--;
		}
		i++;
		return  Math.pow(10, i);
		
	}

此方法与求分子的方法类似,只是返回值不同,多设置了一个变量i用来存次方的大小。

在求完整数部分,分子部分和分母部分之后,我们要做的就是对分数的化简。

这一部分算法很简单,直接看代码就好。

for(int i = (int)fenzi; i >= 2; i--) {
/**从fenzi的大小开始迭代,直到i为1为止
			 * */
			if(fenzi % i == 0 && fenmu % i == 0) {
				fenzi /= i;
				fenmu /= i;
			}
			
		}

这是简单的for循环的应用,不多赘述。

具体源代码如下:

package java_Test;

import java.math.BigDecimal;
import java.util.Scanner;
/**小数转分数
 * */
public class transport_Number {
	
	public double fenmu = 0,fenzi = 0;
	/**确定整数部分*/
	public int getZhengShu(double set) {

		if(set - 1 > 0) {
			//使用强制类型转换去掉浮点数部分
			return  (int)set;
		
		}
		return 0;//否则返回0
	}
	
	/**初步确定分子大小
	 * 未化简*/
	public double fenZi(double set) {
		//调用BigDecimal类
		BigDecimal b1 = new BigDecimal(Double.toString(set)); 
		//set的整数部分
		BigDecimal b2 = new BigDecimal(zhengShu(set));
		/**即b1 - b2
		 * 此时set为原来的小数部分
		 * 即0.``````*/
		set =  b1.subtract(b2).doubleValue(); 
		/**因为小数部分不超过7位
		 * 故先将其乘以10的七次方,再对10求余
		 * 若个位为零,则set除以10
		 * 直到set的个位不为0为止
		 * 此时的数即为分子部分
		 * */
		set *= (int)Math.pow(10, 7);
		while(set % 10 == 0) {
			set /= 10;
		}
		set *= 10;
		
		return set;
	}
	/**初步确定分母的大小
	 * 未化简
	 * */
	public double fenMu(double set) {
		/**...*/
		BigDecimal b1 = new BigDecimal(Double.toString(set)); 
		BigDecimal b2 = new BigDecimal(zhengShu(set)); 
		set =  b1.subtract(b2).doubleValue(); 
		/**分母的次方
		 * 以10为底*/
		int i = 7;
		/**每消去个位的一个0
		 * i--,即分母除以10*/
		set *= (int)Math.pow(10, 7);
		while(set % 10 == 0) {
			set /= 10;
			i--;
		}
		i++;
		return  Math.pow(10, i);
		
	}
	/**返回分子
	 * 已约分
	 * */
	public int getFenZi(double set) {
		 /**若已经调用过Mu()方法,则直接返回fenzi即可
			 * 节省一半的时间*/
		if(fenzi == 0 && fenmu == 0) {
			 fenzi = fenZi(set);
				fenzi = (int)fenzi;
				 fenmu = fenMu(set);
		/**从fenzi的大小开始迭代,直到i为1为止 */
		for(int i = (int)fenzi; i >= 2; i--) {
			if(fenzi % i == 0 && fenmu % i == 0) {
				fenzi /= i;
				fenmu /= i;
			}
			
		}
		 }
		 else
		return (int)fenzi;
		 
		 return (int)fenzi;
	}
	/**返回分母
	 * 已约分
	 * */
	public int getFenMu(double set) {
		/**若已经调用过Zi()方法,则直接返回fenzi即可
		 * 节省一半的时间*/
		 if(fenzi == 0 && fenmu == 0) {
			 fenzi = fenZi(set);
				fenzi = (int)fenzi;
				 fenmu = fenMu(set);
		 /**从fenzi的大小开始迭代,直到i为1为止 */
		for(int i = (int)fenzi; i >= 2; i--) {
			if(fenzi % i == 0 && fenmu % i == 0) {
				fenzi /= i;
				fenmu /= i;
			}
		}
		}
		 else
		return (int)fenmu;
		 
		 return (int)fenmu;
	}
	
	public transport_Number() {	
		//无参构造方法
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		double set = in.nextDouble();//设置初始值
		int []pr = new int[3];//存储整数、分子、分母
		/**调用自己
		 * 方便使用方法*/
		transport_Number a = new transport_Number();
		pr[0] = a.getZhengShu(set);
		pr[1] = a.getFenZi(set);
		pr[2] = a.getFenMu(set);
		System.out.println(pr[0] + " " + pr[1] + " " + pr[2]);
	}

}

若存在问题,望不吝赐教!

你可能感兴趣的:(输入一个小数,将其转化为分数并输出 java)