float 转成double 。小数点后的变化?

       

 

        //float 的值赋值给float
        float b =2.1f;

        System.out.println(b);
        //将double类型的值赋值给float
        float c = (float) 2.1;
        System.out.println(c);

 

        //将float的数值赋值给double
        double a =(double) 2.1f;
        System.out.println(a);

//b 和c打印出来都是2.1

//就a 打印出来是2.0999999046325684

单精度转双精度的时候,双精度会对单精度进行补位。导致出现偏差

原因简单来说:计算机在计算十进制小数运算的时候需要先转换成二进制进行计算,然后再转换成十进制显示最后结果,这个过程中出现了一些误差,导致了精度丢失。这是程序员经常遇到的问题,如果需要准确地保存小数,需要用 BigDecimal。

double类型数据2.10举例计算机如何将浮点型数据转换成二进制存储,
这里重点讲小数部分转换成二进制:
2.10整数部分就是2,转换成二进制10(这里整数转二进制不再赘述)
小数部分:0.1
0.1*2=0.2取整数部分0,基数=0.2
0.2*2=0.4取整数部分0,基数=0.4
0.4*2=0.8取整数部分0,基数=0.8
0.8*2=1.6取整数部分1,基数=1.6-1=0.6
0.6*2=1.2取整数部分1,基数=1.2-1=0.2
0.2*2=0.4取整数部分0,基数=0.4
.
.
.
.
直至基数为0。1.1用二进制表示为:1.000110...xxxx....(后面表示省略)
0.1 = 0*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)+.........而double类型表示小数部分只有52位,当向后计算 52位后基数还不为0,那后面的部分只能舍弃,从这里可以看出float、double并不能准确表示每一位小数,对于有的小数只能无限趋向它。在计算机 中加减成除运算实际上最后都要在计算机中转换成二进制的加运算,由此,当计算机运行System.out.println(2.00-1.10);
时会拿他们在计算机内存中的二进制表示计算,而1.10的二进制表示本身就不准确,所以会出现0.8999999999999999的结果。

所有a的值为:2.0999999046325684

您的问题已经有小伙伴解答了,请点击【采纳】按钮,采纳帮您提供解决思路的答案,给回答的人一些鼓励哦~~

ps:开通问答VIP,享受5次/月 有问必答服务,了解详情↓↓↓

【电脑端】戳>>>  https://vip.csdn.net/askvip?utm_source=1146287632
【APP 】  戳>>>  https://mall.csdn.net/item/52471?utm_source=1146287632