仿照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的?
答:通过继承实现复用,依赖内部属性,会影响别人的代码,合适,防止冗杂,提供方法。

浙公网安备 33010602011771号