博客
关于我
【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 | pytime,一个实用的 时间和日期处理 Python 库!
查看>>
python | pyupgrade,一个有趣的 Python 库!
查看>>
python | pyvips,一个神奇的 图像处理 Python 库
查看>>
Python | qutip,一个高级的 Python 库!
查看>>
python | rapidjson,一个实用的 提高JSON处理效率 Python 库!
查看>>
python | reflex,一个无敌的 Python 库!
查看>>
python | reloading,一个强大的 Python 库!
查看>>
python | rich,一个无敌的 Python 库!
查看>>
python | rlax,一个超强的 强化学习领域 Python 库!
查看>>
python | rpyc,一个超实用的 Python 库!
查看>>
python | rq,一个无敌的 关于Redis 的Python 库!
查看>>
python读取字符串指定位置字符_python要怎么截取指定位置的字符串呢?
查看>>
python | scikit-llm,一个神奇的 Python 库!
查看>>
python | sentry,一个超酷的 关于错误监控工具 Python 库!
查看>>
python | shiv,一个超酷的 打包工具 Python 库!
查看>>
python | six,一个神奇的 Python 库!
查看>>
Python读取图片的几种方法供net使用
查看>>
python | spacy,一个神奇的 Python 库!
查看>>
python | sqlmap,一个实用的 Python 库!
查看>>
python | sumy,一个超酷的 用于文本摘要的 Python 库!
查看>>