• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

iwanttoberipped

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Day5之,原来数据类型还有这么多知识点

Day5数据类型扩展知识

关于数据类型的拓展知识

  • 二进制数是在数字前加上0b,八进制是加上0,十六进制是加上0x
public static void main(String[] args) {
        //整数拓展 进制 二进制0b、八进制0、十六进制0x

        int i = 10;
        int i2 = 010;//八进制
        int i3 = 0x10;//十六进制

        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3); = 10_0000_0000;//数字中可以用下划线分割
    int years = 20

结果:image-20240401163223386

  • 浮点数的拓展:

    浮点数本身存在限额,且自带舍入误差,所以看上去相等其实不相等,看上去不等也许计算出会相等

    如以下计算

    
            float f =0.1f;
            double d = 1.0/10;
            //两者理应都是0.1
            System.out.println(f==d);//显示false,证明并不相等,两个等号是计算相等
            System.out.println(f);
            System.out.println(d);
    
            float d1 = 456564416516525f;
            float d2 = d1+1;
            System.out.println(d1==d2);//显示true
    

    结果:

    image-20240401163633662

    1. f=d显示false,虽然两者看起来都是0.1,但是这个实数却不是跟我们所想的计算一样,而是通过别的计算来获得一个近似的实数(具体的我也不是看得很懂所以就不写了),总之真实的数字不是像我们所看到的那样,隐藏的数字也因此获得了精度的限制,看起来都是0.1,但是其实float和double计算出了两个完全不同的数字,因此两者不会相等。

    2. d1=d2,则是因为浮点数的离散和舍入误差的特征,虽然加了1,但是在后续的计算中又舍掉了,导致最后输出的依旧是这个值,而这里同处在一个数据类型下计算,所以不存在精度不同的问题。

      image-20240401164602223

    3. 综上所述,使用浮点数作比较会有诸多限制,所以,不如不用!

  • 字符串的拓展,其实就是字符本身是Unicode的编码,占两个字节,且自身都有编号,在U0000-UFFFF之间,可以通过强制转换转换成数字:

    char c1 = 'a';
            char c2 = '中';
    
    
            System.out.println(c1);
            System.out.println((int)c1);//强制转换
    
            System.out.println(c2);
            System.out.println((int)c2);
    

    结果:image-20240401165126304

    即,“a”的值为97,而“中”的值为20013,此外宋的值是“23435”

  • java中存在转译字符,即使用特定字符表示符号如

     //转译字符
            // \t(空格) ---制表符
            // \n(换行)
            //more...
    
            System.out.println("hello\nworld");
    

    结果image-20240401165605435

  • 布尔值中的拓展

    在java的布尔值判断格式中

      boolean flag = true;
    if (flag){}
    if (flag==true){}
    
    

    两个if后面的代码是一模一样的,按时显然前者更精简,还是使用前一个比较好。

关于数据类型转换

java是强类型语言,必须保证数据类型相同才能进行下一步,因此会经常进行数据类型的转换

java中的数据类型存在高低之分

byte、short、char<int<long<float<double

可见位越多则越高,此外浮点数总是先于整数

1.数据转换的类型

java中主要有两种类型的数据转换

  • 强制转换

    即从高到低必须进行强制数据转换

    public class demo1 {
        public static void main(String[] args) {
            int i = 126;
            byte b = ((byte)i);//byte最大到127,到128就会出问题,内存溢出
    
            //强制转换是改变类型和变量名
    
            System.out.println(i);
            System.out.println(b);
    

    结果是

    image-20240401171016289

  • 自动转换

    即由低到高是自动转换,无需变化

    public class demo1 {
        public static void main(String[] args) {
            int i = 126;
            double b = i;
    

    结果为:

    image-20240401171253649

  • 在强制转换中,如果超过限额,就会出现内存溢出情况,如上面的第一个byte的值大于127,则会出现错误,比如:

    public class demo1 {
        public static void main(String[] args) {
            int i = 128;
            byte b = ((byte)i);
    

    结果是:

    image-20240401171551592

2.数据转换的注意事项

  • 无法对布尔值进行计算(true or false)

  • 不能把对象类型转换为完全安全不相干的类型

  • 在大容量向小容量转换时要强制转换

  • 转换有可能出现内存溢出(上文提到)和小数点精度问题

    如下面的案例

     System.out.println((int)23.7);//double
            System.out.println((int)-45.89f);//float
    

    结果为

    image-20240401172040997

  • 此外字符也可以转换(本质上是编码)

    如:

    char c ='a';
            int d = c+1;
            System.out.println(d);
            System.out.println((char)d);
    

    结果为:

    image-20240401172232568

  • 较大的数据转换要注意一些问题,我全写代码里了:

    public class demo2 {
        public static void main(String[] args) {
            //操作较大的数字要注意内存溢出
            int money = 10_0000_0000;//数字中可以用下划线分割(jdk7的新功能)
            int years = 20;
            int total = money*years;
            System.out.println(total);
            //输出了一个负数,证明内存溢出
            //试试看long?
            long total2 = money*years;
            System.out.println(total2);
            //还是这个数字,因为两个int最后还int,在转换前就已经是错误数字,所以即便使用long也没有用
            //尝试一下用类型转换解决这个问题
            System.out.println("----------------------------");
            long total3 = ((long)money)*years;
            long total4 = money*((long)years);
            System.out.println(total3);
            System.out.println(total4);
            //都显示出正常的数字,说明只要在过程中转换其中一个,就可以全部提升到long,解决极限问题
            //尽量用大写的L,不然容易看成1
    

    以上的输出结果为

    image-20240401172504103

    ps:注意long中的L表示要用大写,不然容易看成1.

posted on 2024-04-01 17:27  宋桥  阅读(11)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3