仿照BigDecimal类以面向对象的方式设计有理数类

有理数类的设计

1.完整代码

package Work;

public class RationalNumber {
	private long numerator = 0; //分子
	private long denominator = 1; //分母
	public long getNumerator() {
		return numerator;
	}

	public void setNumerator(long numerator) {
		this.numerator = numerator;
	}

	public long getDenominator() {
		return denominator;
	}

	public void setDenominator(long denominator) {
		this.denominator = denominator;
	}

	public RationalNumber(){//分子分母初始化
		this.numerator = 0;
		this.denominator = 1;
	}

	public RationalNumber(long numerator, long denominator){
		this.numerator = numerator/gcd(Math.abs(numerator), Math.abs(denominator)); //分子化简(除以分子、分母的最大公约数)
		this.denominator = denominator/gcd(Math.abs(numerator), Math.abs(denominator));//分母化简(除以分子、分母的最大公约数)
	}

	public static long gcd (long number1, long number2){//最大公约数计算
		while (number1 != number2)
		{
			if (number1 > number2)
				number1 = number1 - number2;
			else
				number2 = number2 - number1;
		}
		return number1;
	}
	public static RationalNumber add (RationalNumber num1, RationalNumber num2) {//有理数求和
		long tempNumerator = num1.numerator*num2.denominator + num1.denominator*num2.numerator;
		long tempDenominator = num1.denominator*num2.denominator;
		long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
		RationalNumber rationalNumber = new RationalNumber(tempNumerator/gcd,tempDenominator/gcd);
		return rationalNumber;
	}

	public static RationalNumber subtract (RationalNumber num1, RationalNumber num2) {//有理数求差
		long tempNumerator = num1.numerator*num2.denominator - num1.denominator*num2.numerator;
		long tempDenominator = num1.denominator*num2.denominator;
		long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
		RationalNumber rationalNumber = new RationalNumber(tempNumerator/gcd,tempDenominator/gcd);
		return rationalNumber;
	}

	public static RationalNumber multiply (RationalNumber num1, RationalNumber num2) {//有理数求积
		long tempNumerator = num1.numerator*num2.numerator;
		long tempDenominator = num1.denominator*num2.denominator;
		long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
		RationalNumber rationalNumber = new RationalNumber(tempNumerator/gcd,tempDenominator/gcd);
		return rationalNumber;
	}

	public static RationalNumber divide (RationalNumber num1, RationalNumber num2) {//有理数求商
		long tempNumerator = num1.numerator*num2.denominator;
		long tempDenominator = num1.denominator*num2.numerator;
		long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
		RationalNumber rationalNumber = new RationalNumber(tempNumerator/gcd,tempDenominator/gcd);
		return rationalNumber;
	}
}

2.测试代码

package Work;

public class test {
	private static RationalNumber num1=new RationalNumber(1,2); //第一个分数
	private static RationalNumber num2=new RationalNumber(12,4); //第二个分数
	private static double test = Double.parseDouble("3457367536")/(double)6769656;
	public static void main(String[] args) {
		RationalNumber result=RationalNumber.add(num1, num2);
		System.out.println("有理数求和:");
		System.out.println("(分数形式):1/2+24/4="+result.getNumerator()+"/"+result.getDenominator());
		System.out.println("(小数形式):1/2+24/4="+(result.getNumerator()/(double)result.getDenominator()));
		result=RationalNumber.subtract(num1, num2);
    	System.out.println("有理数求差:");
		System.out.println("(分数形式):1/2-24/4="+result.getNumerator()+"/"+result.getDenominator());
		System.out.println("(小数形式):1/2-24/4="+(result.getNumerator()/(double)result.getDenominator()));
		result=RationalNumber.multiply(num1, num2);
		System.out.println("有理数求积:");
		System.out.println("(分数形式):1/2*4/4="+result.getNumerator()+"/"+result.getDenominator());
		System.out.println("(小数形式):1/2*4/4="+(result.getNumerator()/(double)result.getDenominator()));
		result=RationalNumber.divide(num1, num2);
		System.out.println("有理数求商:");
		System.out.println("(分数形式):1/2-4/4="+result.getNumerator()+"/"+result.getDenominator());
		System.out.println("(小数形式):1/2*4/4="+(result.getNumerator()/(double)result.getDenominator()));
	}
}

3.测试结果

4.问题回答

:尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
:相比于c语言Java中的类可以初始化,Java默认为public等等
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
:别人如何复用你的代码?
别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
有理数类的public方法是否设置合适?为什么有的方法设置为private?
你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
:通过继承实现复用,依赖内部属性,会影响别人的代码,合适,防止冗杂,提供方法。

posted @ 2021-09-27 19:17  妙奇名莫  阅读(50)  评论(0)    收藏  举报