关于java的精度损失问题

大家好,我是java初学者,对于精度损失还是不太清楚。我们知道对于表数范围:byte,short,int,long,float,double依次增大,所以以下代码应该会报错精度损失:
byte a =1;
byte b =2;
byte i = a +b;
但是,为什么下面这个编译时不报错?
float a = 1.2f;
float b = 2;
float i = a + b;
究竟为什么?等号右自动转换成double,赋值给float不会损失精度???
大神在哪里?

能不能编译和精度损失无关,和是否有隐式的类型转换有关。

float b = 2;
相当于 float b = (float)2;

所以此时b已经是浮点了。

等号右边相加的结果,不是double,是float所以不会有经度损失。
float a = 1.2f; //1行
float b = 2; //2行

float i = a + b; //3行
小数默认是double型,但是1行你指定了是float型(1.2f),2行是一个int,所以3行右边的结果,是float,不是double,所以不会经度损失。
如果,1行不加f,编译会报错(小数默认是double型)。

 byte i = a +b;//java中,虽然a,b都是byte类型,但a+b这种形式的加法,a+b在做加法前都会转换成int类型,所有a+b的结果是int型,int到byte会精度丢失,需要强转(byte)(a+b)
 float i = a + b;//这里a,b都是float,两个float数值相加不需要转换类型,不是你说的先转换成double

byte a =1;这里有一个隐含的转型,就是说如果后面是一个常数的话,会隐含转型为byte(当然得在byte范围之内,否则也会出错)
byte i = a +b;这里会有一个隐含的类型拓展问题,也就是说会将a,b提升为int,然后参与运算,索引必须强制类型转换

float a = 1.2f;//必须加f,因为默认是double,而double转float会丢失精度
float b = 2;//int转float,而且是一个常数,可以隐式转型为float,
float i = a + b;//隐含转型为最高的,然后进行运算,默认最低是int类型。两者都是float,不会出现double的,所以是可以的,

首先,你第二浮点型的b是一个2,他与float型进行运算,结果为float,但如果是2.0那么就肯定是double了(损失精度),第一个byte型的,会报精度损失
public class QTest_4 {

public static void main(String[] args) {
    byte a =1;
    byte b =2;
    show(a+b);
    float c = 1.2f;
    float d = 2;
    show(c+d);
    //因此在运算过程中,有些会自动转换成别的类型,
    //但你第二个最高是float,所以,就是float
}

public static void show(int a)
{
    System.out.println("int型重载");
}
public static void show(byte a)
{
    System.out.println("byte型重载");
}

public static void show(float a)
{
    System.out.println("float型重载");
}
public static void show(double a)
{
    System.out.println("double型重载");
}

}

默认的精度类型导致的
byte i= a+b 中,a+b 后默认的类型 为int类型 所以会损失精度
float i=a+b 中,两边都是 float ,所以不会出错

float i = a+b;不会报错?明明已经精度损失了啊??大范围赋值给小范围?

a和b都是float类型,并且a+b的和并没有超出float类型的范围和精度

float a = 1.2f;(float类型)
float b = 2;(int精度于float,自己转为float)
float i = a + b;(两者都是float,相加还是folat)

float a = 1.2f;(float类型)
float b = 2;(int精度小于float,自己转为float)
float i = a + b;(两者都是float,相加还是float)