java分数计算

该博客介绍了如何实现分数计算的需求,包括最大公约数和最小公倍数的计算,并定义了一个`MyFraction`分数类以及`FractionUtils`分数工具类,提供了分数的加、减、乘、除操作。通过欧几里得算法计算最大公约数,进而简化分数。
摘要由CSDN通过智能技术生成
0.目前在项目中有一个分数计算的需求
1.首先我们需要了解一下最小公倍数和最小公约数
最大公因数:两个或者多个整数共有的约数中最大的一个。
	求法:欧几里德算法gcd(a,b) = gcd(b,a mod b)首先a>b,直到取余为0,则这个数b位置就是最大公因数。
最小公约数:两个或多个整数的共有的倍数中最小的一个。
	求法:[a,b] = axb/(a.b) 最小公倍数=ab乘积除以最大公因数
2.定义一个分数类
/**
 * @author: author
 * @date: 2022/7/19 10:42
 */
public class MyFraction {
    /**
     * 分子
     */
    private Integer molecular;
    /**
     * 分母
     */
    private Integer denominator;

    public MyFraction() {
    }

    public MyFraction(Integer molecular, Integer denominator) {
        if (molecular == 0 || denominator == 0){
            throw new RuntimeException("分子或者分母不能为0");
        }
        this.molecular = molecular;
        this.denominator = denominator;
    }

    public Integer getMolecular() {
        return molecular;
    }

    public void setMolecular(Integer molecular) {
       if (molecular == 0){
           throw new RuntimeException("分子不能为0");
       }
        this.molecular = molecular;
    }

    public Integer getDenominator() {
        return denominator;
    }

    public void setDenominator(Integer denominator) {
        if (denominator == 0 ){
            throw new RuntimeException("分母不能为0");
        }
        this.denominator = denominator;
    }

    @Override
    public String toString() {
        return "MyFraction{" +
                "molecular=" + molecular +
                ", denominator=" + denominator +
                '}';
    }
}


3.定义一个分数工具类
/**
 * @author: author
 * @date: 2022/7/19 13:13
 */
public class FractionUtils {

    /**
     * 最大公约数
     * @param x
     * @param y
     * @return
     */
    public static int approximation(Integer x,Integer y){
        return x.compareTo(y)>0 ? ((x%y) == 0 ? y : approximation(y,x%y)) : ((y%x) == 0 ? x : approximation(x,y%x));
    }
    /**
     * 最小公倍数
     * @param x
     * @param y
     * @return
     */
    public static int multiple(Integer x,Integer y){
        return x*y/approximation(x,y);
    }

    /**
     * 分数相加
     * @param a
     * @param b
     * @return
     */
    public static MyFraction add(MyFraction a,MyFraction b){
        MyFraction add = new MyFraction();
        //获取最小公倍数--分母
        Integer denominator = multiple(a.getDenominator(), b.getDenominator());
        //分子
        Integer molecular = (a.getMolecular()*(denominator/a.getDenominator())) + (b.getMolecular()*(denominator/b.getDenominator()));
        if (molecular==0){
            throw new RuntimeException("相加分子为0");
        }
        //分子分母约分 获取最大公约数
        Integer approximation = approximation(denominator, Math.abs(molecular));
        add.setMolecular(molecular/approximation);
        add.setDenominator(denominator/approximation);
        return add;
    }

    /**
     * 相减
     * @param a
     * @param b
     * @return
     */
    public static MyFraction reduce(MyFraction a,MyFraction b){
        MyFraction reduce = new MyFraction();
        //获取最小公倍数--分母
        Integer denominator = multiple(a.getDenominator(), b.getDenominator());
        //分子
        Integer molecular = (a.getMolecular()*(denominator/a.getDenominator())) - (b.getMolecular()*(denominator/b.getDenominator()));
        if (molecular==0){
            throw new RuntimeException("相减分子为0");
        }
        //分子分母约分 获取最大公约数
        Integer approximation = approximation(denominator, Math.abs(molecular));
        reduce.setMolecular(molecular/approximation);
        reduce.setDenominator(denominator/approximation);
        return reduce;
    }

    /**
     * 相乘
     * @param a
     * @param b
     * @return
     */
    public static MyFraction multiplication(MyFraction a,MyFraction b){
        MyFraction multiplication = new MyFraction();
        //分母
        Integer denominator = a.getDenominator() * b.getDenominator();
        //分子
        Integer molecular = a.getMolecular() * b.getMolecular();
        //最大公约数
        Integer approximation = approximation(denominator, Math.abs(molecular));
        multiplication.setMolecular(molecular/approximation);
        multiplication.setDenominator(denominator/approximation);
        return multiplication;
    }

    /**
     * 相除
     * @param a
     * @param b
     * @return
     */
    public static MyFraction division(MyFraction a,MyFraction b){
        //b的倒数
        Integer denominator = b.getDenominator();
        Integer molecular = b.getMolecular();
        b.setDenominator(Math.abs(b.getMolecular()));
        b.setMolecular(molecular.compareTo(0)<0 ? -denominator : denominator);
        return multiplication(a,b);
    }
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值