Java 有理数类 分数类 Rational类的设计与实现

要实现Rational类的加减乘除,要实现其可比较性,要覆盖toString()方法,要实现不同数据类型的转换等。

  1 package chapter14;
  2
  3 public class Rational extends Number implements Comparable {
  4     private long numerator=0;
  5     private long denominator=1;
  6
  7     public Rational(){
  8         this(0,1);
  9     }
 10     public Rational(long numerator, long denominator) {
 11         // TODO Auto-generated constructor stub
 12         long gcd=gcd(numerator,denominator);
 13         this.numerator=((denominator>0)?1:-1)*numerator/gcd;
 14         this.denominator=Math.abs(denominator)/gcd;
 15     }
 16
 17     private static long gcd(long n, long d) {
 18         // TODO Auto-generated method stub
 19         long n1=Math.abs(n);
 20         long n2=Math.abs(d);
 21         int gcd=1;
 22
 23         for(int k=1;k<=n1&&k<=n2;k++){
 24             if(n1%k==0&&n2%k==0)
 25                 gcd=k;
 26         }
 27         return gcd;
 28     }
 29
 30     public long getNumerator(){
 31         return numerator;
 32     }
 33     public long getDenominator(){
 34         return denominator;
 35     }
 36
 37     public Rational add(Rational secondRational){
 38         long n=numerator*secondRational.getDenominator()+
 39                 denominator*secondRational.getNumerator();
 40         long d=denominator*secondRational.getDenominator();
 41         return new Rational(n,d);
 42     }
 43
 44     public Rational subtract(Rational secondRational){
 45         long n=numerator*secondRational.getDenominator()-
 46                 denominator*secondRational.getNumerator();
 47         long d=denominator*secondRational.getDenominator();
 48         return new Rational(n,d);
 49     }
 50
 51     public Rational multiply(Rational sR){
 52         long n=numerator*sR.getNumerator();
 53         long d=denominator*sR.getDenominator();
 54         return new Rational(n,d);
 55     }
 56
 57     public Rational divide(Rational sR){
 58         long n=numerator*sR.denominator;
 59         long d=denominator*sR.numerator;
 60         return new Rational(n,d);
 61     }
 62
 63     public String toString(){
 64         if(denominator==1)
 65             return numerator+"";
 66         else
 67             return numerator+"/"+denominator;
 68     }
 69
 70     public boolean equals(Object parm1){
 71         if((this.subtract((Rational)(parm1))).getNumerator()==0)
 72             return true;
 73         else
 74             return false;
 75     }
 76
 77
 78
 79     @Override
 80     public int compareTo(Object o) {
 81         // TODO Auto-generated method stub
 82         if((this.subtract((Rational)o)).getNumerator()>0)
 83                 return 1;
 84         else if((this.subtract((Rational)o)).getNumerator()<0)
 85             return -1;
 86         else
 87             return 0;
 88     }
 89
 90     @Override
 91     public int intValue() {
 92         // TODO Auto-generated method stub
 93         return (int)doubleValue();
 94     }
 95
 96     @Override
 97     public long longValue() {
 98         // TODO Auto-generated method stub
 99         return (long)doubleValue();
100     }
101
102     @Override
103     public float floatValue() {
104         // TODO Auto-generated method stub
105         return (float)doubleValue();
106     }
107
108     @Override
109     public double doubleValue() {
110         // TODO Auto-generated method stub
111         return numerator*1.0/denominator;
112     }
113
114
115
116
117 }

  有理数封装在Rational对象中。在机器内部,有理数总表示为它的最简形式,分子决定有理数的符号,分母总为正数。

  gcd()方法是私有静态的。

  Object类中的toString方法和equals方法在Rational类中被覆盖。toString()方法以numerator/denominator的形式返回一个Rational对象的字符串表示。

  

时间: 2024-07-31 16:06:47

Java 有理数类 分数类 Rational类的设计与实现的相关文章

设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。(Java语言)

这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要提供以下的功能: double toDouble(); 将分数转换为double Fraction plus(Fraction r); 将自己的分数和r的分数相加,产生一个新的Fraction的对象.注意小学四年级学过两个分数如何相加的哈. Fraction multiply(Fraction r); 将自己的分数和r的分数相乘,产生一个新的Fraction的对象. void print(); 将

黑马程序员——Java基础--IO流(一)---File类以及其他流对象

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.File类 File类是将文件系统中的文件和文件夹封装成了对象.提供了更多的属性和行为可以对这些文件和文件夹进行操作.这些是流对象办不到的,因为流只操作数据.File对象可以作为参数传递给流对象的构造函数.File 类的实例是不可变的:也就是说,一旦创建,File 对象表示的抽象路径名将永不改变. 1.File类中的方法 (1).File类的构造方法以及字段 1 new File(Stri

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

java操作数据库的通用的类

package cn.dao; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet;

Java知多少(23)类的基本运行顺序

我们以下面的类来说明一个基本的 Java 类的运行顺序: 1 public class Demo{ 2 private String name; 3 private int age; 4 public Demo(){ 5 name = "微学苑"; 6 age = 3; 7 } 8 public static void main(String[] args){ 9 Demo obj = new Demo(); 10 System.out.println(obj.name + "

java中的URLEncoder和URLDecoder类的联系与区别

今天碰到了这个问题,就查找了些资料总结下:java中的URLEncoder和URLDecoder类的联系与区别. 首先说这两者的联系与区别: URLEncoder是编码,URLDecoder是解码.两者的转换过程刚好是相反的.URLEncoder该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法:URLDecoder该类包含了将 String 从 application/x-www-form-urlencoded MI

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对比

本文主要介绍String类.StringBuffer类.StringBuilder类的区别  : 一.概述 (一)String 字符串常量,但是它具有不可变性,就是一旦创建,对它进行的任何修改操作都会创建一个新的字符串对象. (二)StringBuffer 字符串可变量,是线程安全的,和StringBuilder类提供的方法完全相同. 区别在于StringBuffer每个方法中前面添加了"synchronized",保证其是线程安全的. (三)StringBuilder 字符串可变量,