qq_31029907
qq_31029907
2015-09-03 15:46
采纳率: 0%
浏览 4.3k

关于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不会损失精度???
大神在哪里?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • devmiao
    devmiao 2015-09-03 16:11

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

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

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

    点赞 评论
  • on_the_way_to_travel
    拓happy 2015-09-03 16: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型)。

    点赞 评论
  • danielinbiti
    danielinbiti 2015-09-03 23: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
    
    点赞 评论
  • havedream_one
    havedream_one 2015-09-03 23: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的,所以是可以的,

    点赞 评论
  • qq_25724825
    隔壁大老王 2015-09-04 00: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型重载");
    }
    

    }

    点赞 评论
  • dltsbydh
    紫气天堂 2015-09-07 01:43

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

    点赞 评论
  • testcs_dn
    微wx笑 2015-09-12 10:32

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

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

    点赞 评论
  • l18637220680
    我不是李大侠 2016-09-28 05:28

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

    点赞 评论
  • l18637220680
    我不是李大侠 2016-09-28 05:29

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

    点赞 评论

相关推荐