分数是有理数(Rational),我们经常做分数的四则运算得到的是小数,如果我们运行分数的四则运算想要得到分数,要怎样做呢?

用类实现对有理数的封装可以做到。

有理数有两个重要的成员,即分子(numerator)和分母(denominator),另外还有重要的四则运算。

Rational类应该具有以下属性(成员变量)和功能(方法):

1.成员变量:int型变量numerator(分子)、denominator(分母)

2.方法(分数的四则运算):

(1)提供Rational add(Rational r)方法,即有理数调用该方法和参数指定的有理数做加法运算,并返回一个Rational对象。

int newNumerator=numerator*b+denominator*a;//通分后的分子运算

int newDenominator=denominator*b;//分母通分

(2)提供Rational sub(Rational r)方法,即有理数调用该方法和参数指定的有理数做减法运算,并返回一个Rational对象。

int newNumerator=numerator*b-denominator*a;//通分后的分子运算

int newDenominator=denominator*b;//分母通分

(3)提供Rational muti(Rational r)方法,即有理数调用该方法和参数指定的有理数做乘法运算,并返回一个Rational对象。

int newNumerator=numerator*a;//分子相乘

int newDenominator=denominator*b;//分母相乘

(4)提供Rational div(Rational r)方法,即有理数调用该方法和参数指定的有理数做除法运算,并返回一个Rational对象。

int newNumerator=numerator*b;//一个数除于另一个数等于一个数剩于另一个数的倒数

int newDenominator=denominator*a;

根据以上分析,给出Rational类代码如下:

Rational.java

public class Rational {

int numerator; //分子

int denominator; //分母

Rational(){

}

Rational(int a,int b){ //有参构造函数

if(a==0){

numerator=0;

denominator=0;

}

else{

setNumeratorAndDenominator(a,b);

}

}

void setNumeratorAndDenominator(int a,int b){ //设置分子和分母

int c=f(Math.abs(a),Math.abs(b)); //计算最大公约数

numerator=a/c;

denominator=b/c;

if(numerator<0&&denominator<0){

numerator=-numerator;

denominator=-denominator;

}

}

int getNumerator(){

return numerator;

}

int getDenominator(){

return denominator;

}

int f(int a,int b){ //计算最大公约数

if(awhile(r!=0){

a=b;

b=r;

r=a%b;

}

return b;

}

Rational add(Rational r){ //加法运算

int a=r.getNumerator();

int b=r.getDenominator();

int newNumerator=numerator*b+denominator*a;

int newDenominator=denominator*b;

Rational result=new Rational(newNumerator,newDenominator);

return result;

}

Rational sub(Rational r){ //减法运算

int a=r.getNumerator();

int b=r.getDenominator();

int newNumerator=numerator*b-denominator*a;

int newDenominator=denominator*b;

Rational result=new Rational(newNumerator,newDenominator);

return result;

}

Rational muti(Rational r){ //乘法运算

int a=r.getNumerator();

int b=r.getDenominator();

int newNumerator=numerator*a;

int newDenominator=denominator*b;

Rational result=new Rational(newNumerator,newDenominator);

return result;

}

Rational div(Rational r){ //除法运算

int a=r.getNumerator();

int b=r.getDenominator();

int newNumerator=numerator*b;

int newDenominator=denominator*a;

Rational result=new Rational(newNumerator,newDenominator);

return result;

}

}

现在有了Rational类,接下来就可以让该类创建若干个对象,并让它们交互信息必要的四则运算来完成程序要达成的目的(两个或两个以上的分数进行四则运算得到分数),下面的主类MainClass只用Rational对象计算两个分数的四则运算,并计算了2/1+3/2+5/3+…的前10项的和:

MainClass.java

public class MianClass {

public static void main(String[] args) {

// TODO 自动生成的方法存根

Rational firstRational=new Rational(2,10); //第一个分数

Rational secondRational=new Rational(10,5); //第二个分数

//加法运算

Rational resultRational=firstRational.add(secondRational); //进行加法运算

int resultNumerator=resultRational.getNumerator(); //进行加法运算后的分子

int resultDenominator=resultRational.getDenominator();//进行加法运算后的分母

System.out.println("2/10+10/5="+resultNumerator+"/"+resultDenominator);

//减法运算

resultRational=firstRational.sub(secondRational);

resultNumerator=resultRational.getNumerator();

resultDenominator=resultRational.getDenominator();

System.out.println("2/10-10/5="+resultNumerator+"/"+resultDenominator);

//乘法运算

resultRational=firstRational.muti(secondRational);

resultNumerator=resultRational.getNumerator();

resultDenominator=resultRational.getDenominator();

System.out.println("2/10*10/5="+resultNumerator+"/"+resultDenominator);

//除法运算

resultRational=firstRational.div(secondRational);

resultNumerator=resultRational.getNumerator();

resultDenominator=resultRational.getDenominator();

System.out.println("2/10÷10/5="+resultNumerator+"/"+resultDenominator);

//2/1+3/2+5/3+...的前10项的和

int k=1,n=10; //项数

System.out.println("计算2/1+3/2+5/3+...的前"+n+"项的和:");

Rational sum=new Rational(0,1);//和,初始为0

Rational item=new Rational(2,1);//项值,首项为2/1

while(k<=n){

sum=sum.add(item);

k++;

int prevNumerator=item.getNumerator();

int prevDenominator=item.getDenominator();

item=new Rational(prevNumerator+prevDenominator,prevNumerator);

}

resultNumerator=sum.getNumerator();

resultDenominator=sum.getDenominator();

System.out.println("用分数表示:"+resultNumerator+"/"+resultDenominator);

double doubleResult=(resultNumerator*1.0)/resultDenominator;

System.out.println("用小数表示:"+doubleResult);

}

}

运行结果为:

(整理自Java面向对象程序设计第2版)

java有理数类的封装_【Java笔记】有理数的类封装相关推荐

  1. java对数字的处理_[java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  2. java long 对应mybati类型_修改 mybatis-generator 中数据库类型和 Java 类型的映射关系...

    使用 mybatis-generator 发现数据库类型是 tinyint(4) , 生成 model 时字段类型是 Byte ,使用的时候有点不便 数据库的类型和 Model 中 Java 类型的关 ...

  3. Java 微信公众号开发_学习笔记

    一.课程介绍 本套课程的学习内容,开发语言 微信公众号介绍,申请以及后台设置详解 编辑模式下的消息回复,菜单建立,素材管理等 开发前的环境搭建以及工具准备 开发者模式的切换.以及消息的接收与响应 百度 ...

  4. java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发

    [Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...

  5. c++引用另一个类的方法_转:关于A类,B类,C类IP地址的网段和主机数的计算方法...

    转:关于A类,B类,C类IP地址的网段和主机数的计算方法 关于A类,B类,C类IP地址的网段和主机数的计算方法 IP地址是一个32位的二进制数,由四个八位字段组成.每个IP地址包括两部分:一部分为网络 ...

  6. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  7. python新式类和旧式类的区别_浅谈python新式类和旧式类区别

    python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type) ...

  8. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  9. java实型常量用十六进制表示_[Java入门笔记] Java语言基础(二):常量、变量与数据类型...

    常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...

  10. java原生封装_[Java教程]原生AJAX封装

    [Java教程]原生AJAX封装 0 2016-07-12 13:00:08 回归下原生js,网上看到的AJAX封装,遂拿来改改,不知还有何弊端,望指出!1 var ajaxHelper = { 2 ...

最新文章

  1. jQuery的选择器(一)
  2. Yii-mongo操作
  3. boost::make_biconnected_planar用法的测试程序
  4. 国产服务器芯片对比分析,影速分析:通过国内云主机评测对比国内服务器异同...
  5. uniapp 微信小程序打包发布
  6. 飞鸽传书整个逻辑盲写,不做测试
  7. vue data为什么是函数_由 Vue 中三个常见问题引发的深度思考
  8. TextView显示html信息、在文本下面添加下划线、中划线、设置图片
  9. 拓端tecdat|R语言利用基线协变量提高随机对照试验的效率
  10. [洛谷P4081][USACO17DEC]Standing Out from the Herd
  11. D8(YT88)加密狗破解与加密工具
  12. cad卸载_老师傅爱不释手的6款CAD插件,款款优秀,用了就再也不舍得卸载
  13. 索尼计算机bios正确设置,索尼bios设置图解教程
  14. PDF 转 Word - 免费在线 pdf 转换成 word 文档
  15. python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票
  16. PCB布局布线中地的设计(地与地使用跨接)。
  17. 如何选择技术方向和编程语言
  18. Java(详解) 1011 A+B 和 C (15 分)
  19. 通宵教室(ACM水题)
  20. C++学习心得:字符串转换(to_string,stoi,stol,stoul)

热门文章

  1. 西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统(链表版)
  2. 如何获取美团外卖推广链接
  3. c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...
  4. 管理安装软件包yum什么是yum
  5. ODOO13 JS 自定义按钮后续来了
  6. 启动SparkSql,报javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
  7. 嵌入式系统课堂小结5
  8. mysql 最大值65536_SQL server事物复制报错:要复制的 LOB 数据的长度(xxxxx)超出了配置的最大值 65536...
  9. 基于MODIS数据的NDVI与LST相关性分析(IDL代码实现)
  10. メンアットワーク!3 men at work3 猎人们的青春攻略