博客
关于我
【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/

你可能感兴趣的文章
python 写入json数据到数据库
查看>>
Python 列表删除相同的元素
查看>>
Python 初学者需要知道的四条建议
查看>>
Python 判断字符串是否包含子字符串
查看>>
python 判断当前时间是否为零点
查看>>
python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>
python 图片转ico
查看>>
python 图片转文字、语音转文字、文字转语音保存音频并朗读
查看>>
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
查看>>
Python 在并行进程之间共享字典
查看>>
Python 垃圾收集器文档
查看>>
python 基于 wordcloud + jieba + matplotlib 生成词云
查看>>
python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
查看>>
Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
查看>>