课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 不要让类型默默转换
  • 不要让类型默默转换

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 昆明达内Java培训的老师知道,我们做一个小学生的题目,光速每秒30万公里,根据光线的旅行时间,计算月球和地球,太阳和地球之间的距离。代码如下:

    1 public class Client23 {

    2    //光速是30万公里/秒,常量

    3    public static final int LIGHT_SPEED = 30 * 10000 * 1000;

    4

    5    public static void main(String[] args) {

    6        System.out.println("题目1:月球照射到地球需要一秒,计算月亮和地球的距离。");

    7        long dis1 = LIGHT_SPEED * 1;

    8        System.out.println("月球与地球的距离是:" + dis1 + "米");

    9        System.out.println("-------------------------------");

    10        System.out.println("题目2:太阳光照射到地球需要8分钟,计算太阳到地球的距离.");

    11        //可能要超出整数范围,使用long型

    12        long dis2 = LIGHT_SPEED * 60 * 8;

    13        System.out.println("太阳与地球之间的距离是:" + dis2 + "米");

    14    }

    15 }

    估计有人鄙视了,这种小学生的乘法有神么可做的,不错,就是一个乘法运算,我们运行之后的结果如下:

    题目1:月球照射到地球需要一秒,计算月亮和地球的距离。

    月球与地球的距离是:300000000米

    -------------------------------

    题目2:太阳光照射到地球需要8分钟,计算太阳到地球的距离.

    太阳与地球之间的距离是:-2028888064米

    太阳和地球的距离竟然是负的,诡异。dis2不是已经考虑到int类型可能越界的问题,并使用了long型吗,怎么还会出现负值呢?

    那是因为Java是先运算然后进行类型转换的,具体的说就是因为dis2的三个运算参数都是int型,三者相乘的结果虽然也是int型,但是已经超过了int的最大值,所以其值就是负值了(为什么是负值,因为过界了就会重头开始),再转换 long型,结果还是负值。

    问题知道了,解决起来也很简单,只要加个小小的L即可,代码如下:

    long dis2 = LIGHT_SPEED * 60L * 8;

    60L是一个长整型,乘出来的结果也是一个长整型的(此乃Java的基本转换规则,向数据范围大的方向转换,也就是加宽类型),在还没有超过int类型的范围时就已经转换为long型了,彻底解决了越界问题。在实际开发中,更通用的 做法是主动声明类型转化(注意,不是强制类型转换)代码如下:

    long dis2 = 1L * LIGHT_SPEED * 60L * 8

    既然期望的结果是long型,那就让第一个参与的参数也是Long(1L)吧,也就说明"嗨"我已经是长整型了,你们都跟着我一块转为长整型吧。

    昆明达内Java培训的老师提醒大家注意:基本类型转换时,使用主动声明方式减少不必要的Bug.

    推荐文章

上一篇:用整数类型处理货币

下一篇:java程序:边界还是边界

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56