关于float精度缺失和String new对象不对等的问题

在学习过程中碰到的问题,顺便分享给各位朋友们。

问题一:

public class Demo2 {
    public static void main(String[] args) {
​
        float a=123456789F;
        float b=a+1;
​
        System.out.println(a==b);//ture
    }
}
​
用bigdecimal数学类处理
​

到结果为true,这意味着两个值相等

可我们发现b的值加1应该是123456790

原因:因为float类型的有效位数是8位,double类型的有效位数是16位,结果也就是根据有效位来判断的

这里引发一个问题:我们知道了两个类型的有效位数后,那么我们对两个数据进行运算的结果超出了他们的有效位。结果不是我们想要该怎么办

这个时候我们通常使用大数据类BigDecimal来处理精度失真问题

        double a=2.3;
        double b=1.1;
​        double c=a+b;
        System.out.println(c);//这个结果出现精度new_c
​
//      使用大数据类BigDecimal 把两个可能会出现两个浮点型精度失真问题的变量,转换成BigDecimal类型
        BigDecimal new_a = BigDecimal.valueOf(a);
        BigDecimal new_b = BigDecimal.valueOf(b);
//      使用subtract进行减运算 
        BigDecimal bd_c=new_a.add(new_b);
//      下面把两个值转换回来进行加减乘除就不会出现精度失真
        double new_c=bd_c.doubleValue();
        System.out.println(new_c);
       

BigDecimal 类中有加减乘除方法:

  • public BigDecimal add(BigDecimal value) 加法

  • public BigDecimal subtract(BigDecimal value) 减法

  • public BigDecimal multiply(BigDecimal value) 乘法

  • public BigDecimal divide(BigDecimal value) 除法

注意:BigDecimal通常是解决精度失真的手段,实际开发使用的还是double,所以我们需要把他转换回来再运算就不会出现精度失真

问题二:

public class String_problem {
    public static void main(String[] args) {
​
        String s1= new String("dog");
        String s2= new String("dog");
​
        System.out.println(s1==s2);//false
​
        String s3="cat";
        String s4="cat";
        System.out.println(s3==s4);//true
    }
}
​

s1和s2的结果为false 这个结果为什么不一样呢?

因为s1和s2被创建的两个对象在堆区,虽然两个值一样,但是这里比较的是两个对象的地址。即结果为false

s3和s4的结果为true 这个结果为什么一样呢?

因为s3和s4两个变量的是存储在常量池所以他们的地址和值都是一样的,即结果为true