昆明java培训
达内昆明广州春城路

18487146383

热门课程

不要让类型默默转换

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

昆明达内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培训学费多少?

LinkedIn服务:三人行,必有我师【达内java培训】

Java培训:7月排行榜Go创新高Java稳第一

达内培训:怎样使java程序看起来更美观?

选择城市和中心
贵州省

广西省

海南省

台湾