问题描述
- 关于java的精度损失问题 5C
- 大家好,我是java初学者,对于精度损失还是不太清楚。我们知道对于表数范围:byteshortintlongfloatdouble依次增大,所以以下代码应该会报错精度损失:
byte a =1;
byte b =2;
byte i = a +b;
但是,为什么下面这个编译时不报错?
float a = 1.2f;
float b = 2;
float i = a + b;
究竟为什么?等号右自动转换成double赋值给float不会损失精度???
大神在哪里?
解决方案
byte i = a +b;//java中,虽然ab都是byte类型,但a+b这种形式的加法,a+b在做加法前都会转换成int类型,所有a+b的结果是int型,int到byte会精度丢失,需要强转(byte)(a+b) float i = a + b;//这里ab都是float,两个float数值相加不需要转换类型,不是你说的先转换成double
解决方案二:
能不能编译和精度损失无关,和是否有隐式的类型转换有关。
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 a =1;这里有一个隐含的转型,就是说如果后面是一个常数的话,会隐含转型为byte(当然得在byte范围之内,否则也会出错)
byte i = a +b;这里会有一个隐含的类型拓展问题,也就是说会将ab提升为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类型的范围和精度
解决方案八:
java double 精度损失问题
java精度问题_20120514
java 精度问题