print(0.1+0.2 == 0.3)是Flase还有哪些数这样?

print(0.1+0.2 == 0.3)是Flase还有哪些数这样?有点搞不懂啊啊啊啊啊啊啊啊啊哦哦哦哦哦哦

小数都这样
判断a,b这样
if((a - b) > 0.00000000001)
哈哈原理 可以1e9之类的科学计数法

有一个专门的网站就是说这个问题的https://0.30000000000000004.com/

浮点型的计算都是一个精确度的问题,所以前者确实不等于后者,你用整型就不会了

这是因为在计算机里面对小数的存储方式决定的,你试一下这几句代码:


float a = 0.1f;
System.out.println(a + 0.1);

这是因为计算机对double的存储方式导致,比如0.1,转换成二进制,你会发现除不尽,因此0.1在计算机底层只是一个近似值,所以会出现计算丢失精度的问题
浮点数运算建议使用BigDecimal封装之后进行运算。如计算0.1+0.2可以

// 切记要使用new BigDecimal(String val)或者BigDecimal.valueOf(double val)
BigDecimal val1 = new BigDecimal("0.1"); // 封装值1
BigDecimal val2 = new BigDecimal("0.2"); // 封装值2  
BigDecimal result = val1.add(val2); //用add方法计算结果
double resultVal = result.doubleValue(); // 将结果转为double形式
System.out.println(resultVal == 0.3); // 此时就是true
System.out.println(result.compareTo(new BigDecimal("0.3"))); // 更好的是使用compareTo方法,返回0表示相等

// 为什么不能使用new BigDecimal(double val)呢?同样是精度问题,你以为入参是0.1,其实入参已经是近似值了,字符串才能精确表达
BigDecimal valTest = new BigDecimal(0.1);
System.out.println(valTest);  // 结果是:0.1000000000000000055511151231257827021181583404541015625

浮点数就这样,十进制的浮点数在转化为二进制的时候会出现那种小数点后面位数是无穷位的情况。此时计算机会把一部分信息丢掉,因此浮点数会出现这种问题

小数的情况多了,实际生活中还会遇到1块钱买3件,然后单件再乘3,发现不等于1的情况

  1. 精确问题解决
  • strictfp 此关键字修饰可以拿到精确值,不建议使用,会出现莫名其妙的问题
  • BigDecimal 大多是用这个类计算
  1. 实际问题解决
  • 计算金额可以按分存储计算,显示的时候再除以100
  • 1块钱3件情况,最后一分钱放到最后一件货里,金额就是0.3*2+0.4=1