Java数据类型

数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxeceKRB-1627439287852)(C:\Users\ZZ09J1672\AppData\Roaming\Typora\typora-user-images\image-20210727164704707.png)]

八大基本数据类型

public class DataType {
    public static void main(String[] args) {
        //8大基本数据类型

        //整数
        int num1 = 10; //最常用,4字节,21亿
        byte num2 = 20; //一个字节,-128-127;
        short num3 = 30; //2个字节。-32768-32767
        long num4 = 30L; //8个字节,数值近乎无穷,Long类型要在数字后加个L

        //小数,浮点数
        float num5 = 50.1F; //float数据类型要在数字后加个F,4个字节
        double num6 = 3.1415926; //8个字节

        //字符
        char name = '中'; //一个字节
        //字符串,String 不是关键字,是类
        String English_Name = "亲人";

        //布尔值
        boolean flag = true; //占一位,其值只有true和false两个
    }
}

数据类型拓展

public class DataExpand {
    public static void main(String[] args) {
        /**
         * 数据类型拓展
         */
        //======整数拓展,进制,二进制0b,十进制,八进制0,十六进制0x
        int i = 10;
        int i2 = 010; //八进制0
        int i3 = 0x10; //十六进制0x
        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println("===============================");
        //======浮点数拓展    银行业务怎么表示?钱
        //BigDecimal
        //====================================
        //float   有限  离散  舍入误差  大约  接近但不等于
        // double
        //最好完全使用浮点数进行比较
        float f = 0.1f; //0.1
        double f2 = 1.0/10; //0.1
        System.out.println(f==f2); //false
        System.out.println(f);
        System.out.println(f2);
        //那如何正确比较浮点数呢,这里有两种方案
        float d1 = 2313231323132313f;
        float d2 = d1 + 1;
        System.out.println(d1==d2);//true
        //=================================================
        //字符拓展?
        //============================================
        System.out.println("===================");
        char c1 = 'a';
        char c2 = '中';
        System.out.println(c1);
        System.out.println((int)c1);//强制转换
        System.out.println(c2);
        System.out.println((int)c2);//强制转换
        //所有的字符本质还是数字
        //编码  Unicode 表(97=a,65=A) 2字节 0-65536 Excel最大记录行数 2^16 = 65536
        //U0000-UFFFF
        char c3 = '\u0061';
        System.out.println(c3);//97

        //转义字符
        // \t 制表符
        // \n  换行符
        System.out.println("Hello\tWorld!");
        System.out.println("===========String对象补充=========");
        //对象,从内存分析
        String sa = new String("Hello World");
        String sb = new String("Hello World");
        System.out.println(sa==sb);//false
        String sc = "Hello World";
        String sd = "Hello World";
        System.out.println(sc==sd);//true
        //======布尔值拓展=======
        boolean flag = true;
        if(flag==true){
        }
        if(flag) {
        }//意思相同,这种更精简
    }
}

如何正确比较浮点数大小?

引用

版权声明:本文为CSDN博主「致寿有道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_31282459/article/details/114430355

        //=========浮点数如何比较大小?
        System.out.println("====浮点数比较大小====");
        double db1 = .1 * 3;
        double db2 = .3;
        System.out.println(db1);//0.30000000000000004
        System.out.println(db2);//0.3
        System.out.println(db1 == db2);//false

​ 按照正常逻辑来看,db1经过计算之后的结果应该是0.3,最后打印的结果应该是 true,对吧?但是运行一下就会发现结果并不是 true 而是 false 。

​ 输出一下 db1,发现得到的答案不是想象中的 0.3 而是 0.30000000000000004,所以和 db2 进行比较结果自然是 false

​ 如何正确地比较浮点数(单精度的 float 和双精度的 double),不单单是 Java 特定的问题,在计算机的内存中,存储浮点数时使用的是 IEEE 754 标准,就会有精度的问题。

​ 存储和转换的过程中浮点数容易引起一些较小的舍入误差,正是这个原因,导致在比较浮点数的时候,不能使用“==”操作符——要求严格意义上的完全相等。
那么如何正确比较浮点数呢,这里有两种方案

第一种方案是允许两个值之间存在一点误差(指定一个阈值),使用 Math.abs() 方法来计算两个浮点数之间差异的绝对值,如果这个差异在阈值范围之内,我们就认为两个浮点数是相等的。

final double THRESHOLD = .0001;
double d1 = .1 * 3;
double d2 = .3;
if(Math.abs(d1-d2) < THRESHOLD) {
      System.out.println("d1 和 d2 相等");
} else {
      System.out.println("d1 和 d2 不相等");
}

​ Math.abs() 方法用来返回 double 的绝对值,如果 double 小于 0,则返回 double 的正值,否则返回 double。也就是说,abs() 后的结果绝对大于 0,如果结果小于阈值(THRESHOLD),我们就认为 d1 和 d2 相等。

第二种方案是使用 BigDecimal 类,可以指定要舍入的模式和精度,这样就可以解决舍入的误差。以使用 BigDecimal 类的 compareTo() 方法对两个数进行比较,该方法将会忽略小数点后的位数,怎么理解这句话呢?比如说 2.0 和 2.00 的位数不同,但它俩的值是相等的。a.compareTo(b) 如果 a 和 b 相等,则返回 0,否则返回 -1。

tips: 不要使用 equals() 方法对两个 BigDecimal 对象进行比较,这是因为 equals() 方法会考虑位数,如果位数不同,则会返回 false,尽管数学值是相等的。

BigDecimal a = new BigDecimal("2.00");
BigDecimal b = new BigDecimal("2.0");
System.out.println(a.equals(b));
System.out.println(a.compareTo(b) == 0);

​ 上面的代码中 a.equals(b) 的结果就为 false,因为 2.00 和 2.0 小数点后的位数不同,但 a.compareTo(b) == 0 的结果就为 true,因为 2.00 和 2.0 在数学层面的值的确是相等的。

​ 接下来,用 BigDecimal 来解决开头的问题。

BigDecimal d1 = new BigDecimal("0.1");
BigDecimal three = new BigDecimal("3");
BigDecimal d2 = new BigDecimal("0.3");
d1 = d1.multiply(three);
System.out.println("d1 = " + d1);
System.out.println("d2 = " + d2);
System.out.println(d1.compareTo(d2));

程序输出的结果如下:

d1 = 0.3

d2 = 0.3

0

d1 和 d2 都为 0.3,所以 compareTo() 的结果就为 0,表示两个值是相等的。

​ 总结一下,在遇到浮点数的时候,千万不要使用 == 操作符来进行比较,因为有精度问题。要么使用阈值来忽略舍入的问题,要么使用 BigDecimal 来替代 double 或者 float

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex Sunspot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值