关于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