算法基础_浮点型

此处大致说一下浮点型的注意事项以及两道例题,例题的问题就在源码注释中,不再另外打出、

tip:

说明:浮点数运算有误差,所以不可直接运算
* 有一下两种解决方法:
* 1.一般认为,只要浮点数的误差不超过10的-10次方,就可以认为二者相等,所以此处可以利用Math包里的abs方法来算出二者的绝对值,然后和1E-10(java中表示十的负十次方),如果绝对值小宇1E-10,就认为二者相等
* 2.将题目中的等式变为只有整数的式子,这样就不存在误差了,一般是通分

浮点数有五个特殊数值

正负无穷大:Infinity、-Infinity 比如1.0/0.0 1.0/-0.0

正负无穷小:0.0、-0.0 比如1/Infinity、1/-infinity

没有意义:NaN 比如0.0/0.0

关于高精度的浮点型可以使用BigDecimal类中的方法来定义以及运算,
* 同时,利用MathContext类的方法可以定义小数的精度范围,比如定义100,就是小数点后面100位
* MathContext类还可以设置精度最后一位的取值方式,四舍五入、四舍六入五成双

例题一:

/**
 * 浮点数
 * @author Administrator
 * 问题描述:一罐可乐2.3元,一罐啤酒1.9小明买这两种饮料一共花了82.3元,问小明买了多少罐可乐,多少罐啤酒
 * 且可乐的数量少于啤酒的数量
 */
public class Demo09 {
    /**
     * 说明:浮点数运算有误差,所以不可直接运算
     * 有一下两种解决方法:
     * 1.一般认为,只要浮点数的误差不超过10的-10次方,就可以认为二者相等,所以此处可以利用Math包里的abs方法来算出二者的绝对值,然后和1E-10(java中表示十的负十次方),如果绝对值小宇1E-10,就认为二者相等
     * 2.将题目中的等式两边同时乘以10的倍数,直到式子中没有小数点,这样就不存在误差了
     * @param args
     */
    
    public static void main(String[] args) {
        /*case 1*/
        /*这里直接使用暴力破解了*/
        for(int a = 0;a<35;a++) {
            for(int b = 0;b<43;b++) {
                if(a<b&&Math.abs(a*2.3+b*1.9-82.3)<1E-10) {
                    System.out.println(a+","+b);
                    return;
                }
            }
        }
        /*case 2*/
        for(int a = 0;a<35;a++) {
            for(int b = 0;b<43;b++) {
                if(a<b&&a*23+b*19==823) {
                    System.out.println(a+","+b);
                    return;
                }
            }
        }
    }
}

例题二:

/**
 * 一群海盗(少于等于20人)比赛酒量,规则如下,每次在场的人平分一瓶酒,,然后第一次平分的时候有几个人倒下了,第二次平分的时候又有几个人倒下去了,第三次又有几个人倒下去了,第四次所有人都倒下去了
 * 事后海盗船长说:我正好喝了一瓶儿酒,我是第四次倒下去的
 * 问每一次还没倒下的人数
 * @author Administrator
 *
 */
public class Demo10 {
    /**
     * 关于高精度的浮点型可以使用BigDecimal类中的方法来定义以及运算,
     * 同时,利用MathContext类的方法可以定义小数的精度范围,比如定义100,就是小数点后面100位
     * MathContext类还可以设置精度最后一位的取值方式,四舍五入、四舍六入五成双
     * @param args
     */
    public static void main(String[] args) {
        for(int a = 20;a>0;a--)
            for(int b = a-1;b>0;b--)
                for(int c = b-1;c>0;c--)
                    for(int d = c-1;d>0;d--) {
//                        if(Math.abs(1.0/a+1.0/b+1.0/c+1.0/d-1.0)<1E-10)System.out.println(a+","+b+","+c+","+d);
                        //利用误差很小来大致相等的方法来判断
                        if(a*b*c+a*c*d+b*c*d+a*b*d==a*b*c*d)System.out.println(a+","+b+","+c+","+d);
                        //利用把式子中的数字都变成整数来判断,避免了浮点型精度不够的问题
                    }
                        
    }
}

解题思路:都是直接暴力破解的,就不讲思路了,主要是浮点型精度的问题

希望对大家有所帮助

以上

原文地址:https://www.cnblogs.com/lavender-pansy/p/10549132.html