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

本文共 1889 字,大约阅读时间需要 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 : -1702967296
start: 1562572507160

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

30 * 86400000 = 2592000000

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

数据溢出的起因

问题出现在这里:

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

问题分析

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

30 * 24 = 720
720 * 60 = 43200
43200 * 60 = 2592000
2592000 * 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 : -1702967296
start: 1562572507160

这与预期的结果一致。

结论

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

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

你可能感兴趣的文章
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>