分数运算。包括有几个很有用的函数

Code:
  1. //测试类  
  2. //范例1-3  支持查找功能的分数类 7  
  3. //∷相关函数:compareTo函数  
  4.   
  5. public class Exec2 {  
  6.     public static void main(String[] args) {  
  7.         // 创建两个分数类变量  
  8.         Fraction fraction1 = new Fraction(0.25);  
  9.         Fraction fraction2 = new Fraction(28);  
  10.           
  11.         // 分数相加  
  12.         Fraction fraction3 = fraction1.add(fraction2);  
  13.         System.out.println(fraction1 + "+" + fraction2 + "=" + fraction3);  
  14.   
  15.         // 创建含有5个元素的分数类变量数组  
  16.         Fraction[] fractions = { new Fraction(13), new Fraction(15),  
  17.                 new Fraction(12), new Fraction(14), new Fraction(110) };  
  18.                   
  19.         // 对数组排序,并使用二分折半查找方法来搜索指定分数类变量  
  20.         java.util.Arrays.sort(fractions);  
  21.   
  22.         // 输出命中类变量的下标位置  
  23.         System.out.println("搜索的分数是第"  
  24.                 + java.util.Arrays.binarySearch(fractions, fraction3) + "个!");  
  25.     }  
  26. }  
  27.   
  28. // 支持查找功能的分数类  
  29. class Fraction implements Comparable {  
  30.     // 分子  
  31.     private int numerator;  
  32.       
  33.     // 分母  
  34.     private int denominator;  
  35.   
  36.     // 默认构造函数  
  37.     public Fraction() {  
  38.     }  
  39.   
  40.     // 该构造函数对分子和分母进行初始化  
  41.     public Fraction(int n, int d) {  
  42.         setFraction(n, d);  
  43.     }  
  44.   
  45.     // 该构造函数支持将双精度数转换为相应的分数  
  46.     public Fraction(double d) {  
  47.         convertToFraction(d);  
  48.     }  
  49.   
  50.     // 该函数可以将双精度数转换为相应的分数  
  51.     private void convertToFraction(double d) {  
  52.         int decimalCount = 1;  
  53.           
  54.         // 求双精度数的字符长度  
  55.         int dLen = String.valueOf(d).length();  
  56.           
  57.         // 不断的将双精度数累乘10,直至转换为整数为止  
  58.         for (int i = 0; i < dLen; i++) {  
  59.             d = d * 10;  
  60.             decimalCount *= 10;  
  61.   
  62.         }  
  63.           
  64.         // 分子为最终的整数乘积结果  
  65.         numerator = (int) d;  
  66.           
  67.         // 分母为10的累乘结果  
  68.         denominator = decimalCount;  
  69.           
  70.         // 约分  
  71.         reduct();  
  72.     }  
  73.   
  74.     // 分子的设置函数,并且约分  
  75.     public void setNumerator(int n) {  
  76.         numerator = n;  
  77.         reduct();  
  78.     }  
  79.   
  80.     // 分子的读取函数  
  81.     public int getNumerator() {  
  82.         return numerator;  
  83.     }  
  84.   
  85.     // 分母的设置函数,并且约分  
  86.     public void setDenominator(int d) {  
  87.         // 检查分母是否为0  
  88.         if (d == 0)  
  89.             denominator = 1;  //建议采用异常  
  90.         else  
  91.             denominator = d;  
  92.         reduct();  
  93.     }  
  94.   
  95.     // 分母的读取函数  
  96.     public int getDenominator() {  
  97.         return denominator;  
  98.     }  
  99.   
  100.     // 分数的设置函数,并且约分  
  101.     public void setFraction(int n, int d) {  
  102.         setNumerator(n);  
  103.         setDenominator(d);  
  104.         reduct();  
  105.     }  
  106.   
  107.     // 格式化字符信息输出  
  108.     public String toString() {  
  109.         // 如果为负分数,则将负号提前显示,分子和分母保留为正数,否则分子和分母皆取正数  
  110.         if (numerator * denominator < 0)  
  111.             return "-" + Math.abs(numerator) + "/" + Math.abs(denominator);  
  112.         else  
  113.             return Math.abs(numerator) + "/" + Math.abs(denominator);  
  114.     }  
  115.   
  116.     // 利用对应小数值是否相同来判断分数是否相同  
  117.     public boolean equals(Fraction f) {  
  118.         if (numerator == f.numerator && denominator == f.denominator)  
  119.             return true;  
  120.         else  
  121.             return false;  
  122.     }  
  123.   
  124.     // 利用对应小数值的大小来判断分数的大小  
  125.     public boolean isGreater(Fraction f) {  
  126.         if ((double) numerator / denominator > (double) f.numerator  
  127.                 / f.denominator)  
  128.             return true;  
  129.         else  
  130.             return false;  
  131.     }  
  132.   
  133.     // 约分函数  
  134.     private void reduct() {  
  135.         // 求分子和分母的最小值  
  136.         int minValue = Math.min(Math.abs(numerator), Math.abs(denominator));  
  137.           
  138.         // 将小于分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分并退出  
  139.         for (int i = minValue; i >= 1; i--) {  
  140.             if (numerator % i == 0 && denominator % i == 0) {  
  141.                 numerator = numerator / i;  
  142.                 denominator = denominator / i;  
  143.                 break;  
  144.             }  
  145.         }  
  146.     }  
  147.   
  148.     // 返回分数相加的结果,并且约分  
  149.     public Fraction add(Fraction f) {  
  150.         Fraction fraction = new Fraction();  
  151.         fraction.numerator = numerator * f.denominator + f.numerator  
  152.                 * denominator;  
  153.         fraction.denominator = denominator * f.denominator;  
  154.         fraction.reduct();  
  155.         return fraction;  
  156.     }  
  157.   
  158.     // 返回分数相减的结果,并且约分  
  159.     public Fraction minus(Fraction f) {  
  160.         Fraction fraction = new Fraction();  
  161.         fraction.numerator = numerator * f.denominator - f.numerator  
  162.                 * denominator;  
  163.         fraction.denominator = denominator * f.denominator;  
  164.         fraction.reduct();  
  165.         return fraction;  
  166.     }  
  167.   
  168.     // 返回分数相乘的结果,并且约分  
  169.     public Fraction multiply(Fraction f) {  
  170.         Fraction fraction = new Fraction();  
  171.         fraction.numerator = numerator * f.numerator;  
  172.         fraction.denominator = denominator * f.denominator;  
  173.         fraction.reduct();  
  174.         return fraction;  
  175.     }  
  176.   
  177.     // 返回分数相除的结果,并且约分  
  178.     public Fraction divide(Fraction f) {  
  179.         Fraction fraction = new Fraction();  
  180.         fraction.numerator = numerator * f.denominator;  
  181.         fraction.denominator = denominator * f.numerator;  
  182.         fraction.reduct();  
  183.         return fraction;  
  184.     }  
  185.   
  186.     // 支持两个分数类变量的比较,以实现分数集合的查找功能  
  187.     public int compareTo(Object o) {  
  188.         Fraction f = (Fraction) o;  
  189.           
  190.         // 利用对应小数的大小来比较分数的大小  
  191.         if ((double) numerator / denominator > (double) f.numerator  
  192.                 / f.denominator)  
  193.             return 1;  
  194.         else if ((double) numerator / denominator < (double) f.numerator  
  195.                 / f.denominator)  
  196.             return -1;  
  197.         else  
  198.             return 0;  
  199.     }  
  200.   
  201.     // 根据对应小数是否相同来判断分数是否相同  
  202.     public boolean equals(Object obj) {  
  203.         Fraction f = (Fraction) obj;  
  204.         if (Math.abs((double) numerator / denominator - (double) f.numerator  
  205.                 / f.denominator) < 0.00001)  
  206.             return true;  
  207.         return false;  
  208.     }  
  209.   
  210.     // 相同数值的分数返回相同的哈希码  
  211.     public int hashcode() {  
  212.         String str = String.valueOf((double) numerator / denominator);  
  213.         return str.hashCode();  
  214.     }  
  215.   
  216. }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值