java 数据类型转换遇到的坑
来源:互联网 发布:特高压标准知乎 编辑:程序博客网 时间:2024/06/04 19:44
本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道:System.currentTimeMillis();返回的是long类型的数值。当计算时间相加的时候,如果不注意数据类型的自动转换,则很容易出现问题,如下所示:
Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365 * 5);
上面例子本意是求5年后的过期时间,而实际输出的结果却比当前时间还早的时间值。究其原因是Java数值计算过程中发生的溢出。为什么会出现溢出呢?java不是存在数据类型自动转换吗?转换规则如下所示:
低————————————–>高
byte,short,char->int->long->float->double
在运算中,不同类型的数据先转化为同一类型,然后进行运算。虽然java中存在数据类型自动转换,但是需要注意的是:各运算符是有优先级的,乘法的运算优先级要高于加法,因此,java会执行完乘法运算后再执行加法运行。而执行乘法运算时,所有的操作数都是int型,因此没有触发自动类型转换,运算的结果自然是int型的,所以导致1000 * 60 * 60 * 24 * 365 * 5在计算过程中发生溢出。知道了原因就好办了,可以在乘法运算时进行一次强制类型转换:
Date expiration = new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5);
从而可以获得正确的过期时间。
Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365 * 5);
上面例子本意是求5年后的过期时间,而实际输出的结果却比当前时间还早的时间值。究其原因是Java数值计算过程中发生的溢出。为什么会出现溢出呢?java不是存在数据类型自动转换吗?转换规则如下所示:
低————————————–>高
byte,short,char->int->long->float->double
在运算中,不同类型的数据先转化为同一类型,然后进行运算。虽然java中存在数据类型自动转换,但是需要注意的是:各运算符是有优先级的,乘法的运算优先级要高于加法,因此,java会执行完乘法运算后再执行加法运行。而执行乘法运算时,所有的操作数都是int型,因此没有触发自动类型转换,运算的结果自然是int型的,所以导致1000 * 60 * 60 * 24 * 365 * 5在计算过程中发生溢出。知道了原因就好办了,可以在乘法运算时进行一次强制类型转换:
Date expiration = new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5);
从而可以获得正确的过期时间。
0 0
- java 数据类型转换遇到的坑
- Java的数据类型转换
- Java的数据类型转换
- Java的数据类型转换
- Java 数据类型的转换
- java数据类型的转换
- java数据类型的转换
- java 数据类型的转换
- hadoop数据类型与java 数据类型的转换
- java数据类型间的转换
- java数据类型间的转换
- java数据类型之间的转换
- JAVA数据类型的互相转换
- Java的数据类型转换方法
- JAVA 中数据类型的转换
- Java 数据类型之间的转换
- Java基本数据类型的转换
- Java数据类型的互相转换
- 每天一个Linux命令(51):ping
- underscore.js模板内循环输出
- 转载--HashMap实现原理分析
- tensorflow保存加载模型查看训练参数
- linux英文缩写含义
- java 数据类型转换遇到的坑
- VMware Network Adapter VMnet1/8详解
- C#+VC打造炫酷USB电脑锁<一>引言
- 版本命名规范
- StringUtils详解
- 深度学习——激活函数Sigmoid/Tanh/ReLU
- 利用Robotics Toolbox创建一个机器人
- bootstrap 下箭头的禁用
- ACE在linux下的安装和实例运行详细步骤