返回信息流最近在面试中面试官给了这么一个问题
```JAVA
System.out.println(0.1*2 == 0.2);
System.out.println(0.1*3 == 0.3);
```
第一个结果是true,第二个是false
以前学习时了解过小数部分的表示是用二进制去近似,无限逼近这个小数,但却不是小数,所以代码中浮点数比较相等也往往是判定差值是否在精确度类
我下去也输出了0.1*1到0.1*9
发现0.3 0.6 0.7是无法正确表示出来的,比如0.1*3的结果是**0.30000000000000004**,但0.1*2的结果就是0.2
这是一条镜像帖。来源:北邮人论坛 / java / #66146同步于 2022/1/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
Java浮点数相等问题
B1azar
2022/1/5镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
0.1和0.2在计算机中也无法精确表示,是否相等看的是IEEE754表示的浮点数运算后二进制值是否相同,举个例子:
System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.1)));
System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.2)));
System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.3)));
输出:
11111110111001100110011001100110011001100110011001100110011010
11111111001001100110011001100110011001100110011001100110011010
11111111010011001100110011001100110011001100110011001100110011
前10位是指数(其实是12位,但由于前两位是0所以转换输出的时候前两位被去掉了),后52位是基数,可以看到,0.1和0.2的基数一致,而指数也只是末端+1的区别,所以System.out.println(0.1*2 == 0.2);这个表达式为true
而0.3和前两者的基数明显不同,自然不会相等
0.1*4==0.4同理