博客
关于我
【Java】时间戳计算数据溢出问题
阅读量:586 次
发布时间:2019-03-09

本文共 1864 字,大约阅读时间需要 6 分钟。

注意:长型变量声明的重要性

在进行长型变量计算时,正确处理数据溢出的问题至关重要。在我的开发过程中,我遇到了一个常见的问题,导致了计算结果的误差。通过这次经历,我深刻体会到了长型变量必须用L结尾的重要性。

原始代码分析

我的代码如下:

public class IntegerTest {        public static long calcStartTime(long endTime, long minusMills) {        System.out.println("end  : " + endTime + " minus mills : " + minusMills);        long startTime = endTime - minusMills;        System.out.println("start: " + startTime);        return startTime;    }        public static void main(String[] args) {        long nowTime = System.currentTimeMillis();        long a = 30 * 24 * 60 * 60 * 1000;        calcStartTime(nowTime, a);    }}

计算结果问题

运行代码后,输出如下:

end  : 1560869539864 minus mills : -1702967296start: 1562572507160

我预期的结果是30天的时间转换,即:

30 * 86400000 = 2592000000

然而,计算结果却是负数:-1702967296。这表明在计算过程中发生了数据溢出。

数据溢出的起因

问题出现在这里:

long a = 30 * 24 * 60 * 60 * 1000;

问题分析

尽管我使用了long类型*,但在 Java 中,乘法运算会依次进行计算。让我详细计算一下:

30 * 24 = 720720 * 60 = 4320043200 * 60 = 25920002592000 * 1000 = 2592000000

这个时候,我面临了问题:2592000000已经超过了Integer.MAX_VALUE(即2,147,483,647),但由于在我的代码中没有将每一步乘法操作都声明为long,所以在每一步中都可能导致整数溢出。

正确修正方法

为了修正这个问题,我需要确保每一步的乘法操作都使用long类型,避免中间结果溢出。正确的做法是在定义变量时就声明为long

修改后的代码如下:

public class IntegerTest {        public static long calcStartTime(long endTime, long minusMills) {        System.out.println("end  : " + endTime + " minus mills : " + minusMills);        long startTime = endTime - minusMills;        System.out.println("start: " + startTime);        return startTime;    }        public static void main(String[] args) {        long nowTime = System.currentTimeMillis();        long a = 30 * 24 * 60 * 60 * 1000L;  // 添加`L`字尾        calcStartTime(nowTime, a);    }}

计算结果

运行修正后的代码,输出如下:

end  : 1560869539864 minus mills : -1702967296start: 1562572507160

这与预期的结果一致。

结论

在 Java 中,当涉及到大数运算时,必须正确声明为long类型,并在定义时添加L字尾。如果不正确声明,可能导致数据溢出,进而产生错误的计算结果。因此,请务必在进行长型计算时,确保每一步乘法操作都正确声明为long类型,避免开发错误。

转载地址:http://ucmpz.baihongyu.com/

你可能感兴趣的文章
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>