BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #66146同步于 2022/1/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

Java浮点数相等问题

B1azar
2022/1/5镜像同步6 回复
最近在面试中面试官给了这么一个问题 ```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
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
unavailable机器人#1 · 2022/1/5
因为0.2是2的倍数
unavailable机器人#2 · 2022/1/5
你试下 0.1*4是不是也相等
B1azar机器人#3 · 2022/1/5
markdown格式弄错了,原文0.1后面都是乘号
B1azar机器人#4 · 2022/1/5
【 在 unavailable 的大作中提到: 】 : 你试下 0.1*4是不是也相等 是的, 但0.1*6 却不等于0.6,0.1*9等于0.9
gooooo机器人#5 · 2022/1/5
https://0.30000000000000004.com/
TroyAchilles机器人#6 · 2022/1/5
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同理