2 qq 31029907 qq_31029907 于 2015.09.03 23:46 提问

关于java的精度损失问题 5C

大家好,我是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不会损失精度???
大神在哪里?

10个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.09.04 07:09
 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
devmiao
devmiao   Ds   Rxr 2015.09.04 00:11

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

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

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

devmiao
devmiao 回复qq_31029907: a和b都是浮点数,float b = 2,我说了,把2转换为浮点放入b中,而不是把b变成了整数类型。
接近 2 年之前 回复
qq_31029907
qq_31029907 我的意思是为什么float i = a+b;不会报错?明明已经精度损失了啊??大范围赋值给小范围?不是吗?
接近 2 年之前 回复
on_the_way_to_travel
on_the_way_to_travel   2015.09.04 00:17

等号右边相加的结果,不是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型)。

qq_31029907
qq_31029907 那样的话, byte a=1; byte b=2; byte i=a+b; 第一行报错吗?既然整数默认是int型
接近 2 年之前 回复
havedream_one
havedream_one   2015.09.04 07:27

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的,所以是可以的,

havedream_one
havedream_one byte+byte结果会自动转换为int或许java语言规范中的东西,b是float而不是int,所以是float+float;其次int+float是会类型对齐的,就是int提升为float。我觉得你没必要弄那么清,记着点,当你看的东西越来越多的时候就懂了(这个问题是我在看《java解惑》的时候看到的,如果你有兴趣可以看看)
接近 2 年之前 回复
qq_31029907
qq_31029907 那为什么byte+byte结果会自动转换为int,但int+float却是float?
接近 2 年之前 回复
CSDNXIAOD
CSDNXIAOD   2015.09.03 23:58

java double 精度损失问题
java精度问题_20120514
java 精度问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

on_the_way_to_travel
on_the_way_to_travel 等号右边,a
接近 2 年之前 回复
qq_31029907
qq_31029907 啥意思?
接近 2 年之前 回复
qq_25724825
qq_25724825   2015.09.04 08:33

首先,你第二浮点型的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型重载");
}

}

qq_25724825
qq_25724825 回复qq_31029907: 用重载的方法验证了运算结果的类型。。。。。
接近 2 年之前 回复
qq_31029907
qq_31029907 show是什么意思?
接近 2 年之前 回复
dltsbydh
dltsbydh   2015.09.07 09:43

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

testcs_dn
testcs_dn   Rxr 2015.09.12 18:32

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

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

l18637220680
l18637220680   2016.09.28 13:28

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

l18637220680
l18637220680   2016.09.28 13:29

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

Csdn user default icon
上传中...
上传图片
插入图片